检查输入的字符的C程序是否为数字?

时间:2012-01-30 13:29:49

标签: c

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

我写了以下程序。

这个程序没有给我以下测试用例的完美输出 任何人都可以告诉我,我的逻辑出错了。

/*

 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');
}

4 个答案:

答案 0 :(得分:1)

  1. 你正在处理一个字符串。只需迭代直到找到'\ 0'。不需要对sizeof感到奇怪。
  2. 阅读man isdigit
  3. 如果您确实要将指针传递给scanf,则需要&c[0]。但是,c所有的寂寞都是一个指针,所以你可以说scanf("%s", c);
  4. 那个state变量。尝试在纸上手工运行一些值,看看它会发生什么。

答案 1 :(得分:0)

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

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

state = is_digit(c[29]);

您需要进行两项更改:

  1. 仅迭代用户输入的字符数组。因此,当遇到空终止字符时停止迭代。
  2. 仅当所有字符都是数字时才将状态设置为TRUE
  3. 因为这看起来像是作业,所以我不会为你完整地编写代码!

答案 2 :(得分:0)

您始终覆盖state,因此仅检查最后一个元素是否为数字。

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

改为使用:state = (state_digit(c[i]) && state) [和初始状态为yes]:这意味着,您正在寻找一个“无数字”的条目,一旦找到它,您就会提出答案。< / p>

一旦找到非数字,另一种可能性就是break

答案 3 :(得分:0)

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 < strlen(c); i++) 只要国家变为否,就会休息。