【问题标题】:C program to check entered char is digit or not?C程序检查输入的字符是否为数字?
【发布时间】:2012-02-22 07:00:21
【问题描述】:

我正在尝试通过模式检查来检查输入的字符是否为数字。

我编写了以下程序。

这个程序没有给我以下测试用例的完美输出 谁能告诉我我的逻辑哪里出了问题。

/*

 Output test case

 234234 = It's a digit.
 a3434a = It's not a digit.
 33aa3a = It' not a digit.

*/

#define yes 1
#define no 0

#include <stdio.h>

int main(void)
{
    char c[30];
    int arr_size, result, i=0, state;
    printf("Enter your digit:= ");
    scanf("%s",&c);

    arr_size=(sizeof(c)/sizeof(c[0]));

    for(i; i < arr_size; i++)
    {
        if(check_digit(c[i]))
        state = yes;
        else
        state = no;
    }

    if(!state)
        printf("It's not a digit\n");
    else
        printf("It's a digit\n");

    system("\npause");
    return 0;
}

int check_digit(char c)
{
    return (c>='0' && c<='9');
}

【问题讨论】:

  • 你所谓的“数字”,其他人都称之为“数字”。 (0 到 9 是数字)。而system("\npause") 将不起作用,因为没有名为“\npause”的命令。请改用system("pause"),或者更好的是,不要从 GUI 而是从命令行启动程序。

标签: c


【解决方案1】:
  1. 您正在处理一个字符串。只需迭代直到找到'\0'。无需对sizeof 感到奇怪。
  2. 阅读man isdigit
  3. 如果你真的想传递一个指向scanf的指针,它需要是&amp;c[0]。然而,c all by its lonsome is a pointer so you can just say scanf("%s", c);
  4. 还有那个state 变量。尝试在纸上手动运行一些值,看看会发生什么。

【讨论】:

    【解决方案2】:

    您的for 循环每次迭代都会遍历数组设置state 中的每个字符。每次设置state,都会忘记之前的值。

    因此您的for 循环实际上等同于写作

    state = is_digit(c[29]);
    

    您需要进行两项更改:

    1. 仅遍历用户输入的字符数组。因此,当您遇到空终止字符时,请停止迭代。
    2. 仅当所有字符都是数字时才将状态设置为TRUE

    由于这看起来像家庭作业,我不会为你写完整的代码!

    【讨论】:

    • 如何遍历用户输入的字符?任何内置功能?
    • i &lt; arr_size &amp;&amp; c[i] 的 for 循环测试中作为终止测试
    • while( c[i]!='\0' &amp;&amp; check_digit(c[i]) ) { if(!c[i]) state = yes; else state = no; i++; } 我将循环修改为此,但仍然没有得到我想要的输出。
    • 1.您修改后的代码的摘录是不够的。 2. 你没有告诉我们你的意见是什么。 3. 你没有告诉我们你的输出是什么。 4. 你没有告诉我们你期望的输出是什么。
    【解决方案3】:

    你总是覆盖state,所以它只检查最后一个元素是否是数字。

        if(check_digit(c[i]))
        state = yes;
        else
        state = no;
    

    改用:state = (state_digit(c[i]) &amp;&amp; state) [和初始状态为yes]:这意味着,您正在寻找一个“无数字”条目,一旦找到它,您就会传播答案。

    另一种可能性是 breaking 一旦你找到一个非数字。

    【讨论】:

      【解决方案4】:
      arr_size=(sizeof(c)/sizeof(c[0]));
          //arr_size=30/1
      
      for(i; i < arr_size; i++)
          //for(i; i < 30; i++)
      

      如果您输入的数字少于 30 位,则不会说“否”... 如果您输入这样的 30 位数字:12234**************8877,那么该数字的最后一位数字“7”不会使统计信息为“是”吗?

      使用if(isdigit())for(i; i &lt; strlen(c); i++) 状态变为 no 时休息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-15
        • 1970-01-01
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多