在C

时间:2017-05-08 17:44:18

标签: c

我一直在努力增加一些C语言的经验,以及我的基本添加程序。我要做的一件事是检查输入是数字还是字符,如下所示:

#include <stdio.h>
#include <ctype.h>

int main()
{
    int n, sum=0,c,value;

    printf("Enter the Number of Integers You Want to Add\n");
    scanf("%d", &n);

    if(isdigit(n))
    {
        printf("Enter %d Integers\n", n);


        for(c=1; c<=n; c++)
        {
            scanf("%d", &value);

            if(isalpha(value))
            {
                printf("ENTER INTEGER NOT CHARACTER\n");
                break;

            }
            else
            {
                sum = sum + value;
            }
        }
        printf("Sum of Entered Integers = %d\n",sum);

    }

    else 
    {
        printf("ENTER INTEGER NOT CHARACTER\n");
        break;
    }
    return 0;
}

最初我使用isalpha()尝试了这个,并且程序在添加数字时工作正常但是将字符解释为零而不是打印“非整数”语句。但是,现在我重写它使用isdigit(),它不会将任何输入识别为整数,无论​​它是否。有什么我只是做错了吗?

4 个答案:

答案 0 :(得分:2)

使用scanf读取整数时,只需要一个整数。 (要读取单个字符,您需要%c和指向字符的指针。

当您使用isdigit()时,您需要提供该字符的表示(例如,在ASCII中,字符'0'具有表示48,这确实是它的值作为整数)。回顾一下:

isdigit(0)       is false
isdigit(48)      is true (for ASCII, ISO8859, UTF-8)
isdigit('0')     is true (no matter the character set)
isdigit('0' + n) is true for integers n = 0 ... 9

PS:没有测试scanf的返回值是在寻找麻烦......

答案 1 :(得分:1)

isdigitisalpha都不像您认为的那样工作。这些库函数的目的是检查给定的代码点(表示为int)是否在由标准定义为 digit 字符或 alpha的点的子集内字符。

您应该检查scanf来电的结果,而不是假设它们正常工作,并相应地对这些结果采取行动。如果您请求一个整数并且一个成功扫描,那么它会告诉您。如果失败了,你的行动方案可能是消耗线的其余部分(通过换行或EOF),并可能再试一次:

#include <stdio.h>

int main()
{
    int n,value,sum=0;

    printf("Enter the Number of Integers You Want to Add\n");
    if (scanf("%d", &n) == 1 && n > 0)
    {
        printf("Enter %d Integers\n", n);

        while (n--)
        {
            if (scanf("%d", &value) == 1)
            {
                sum = sum + value;
            }
            else
            {
                // consume the rest of the line. if not EOF, we
                //  loop around and try again, otherwise break.
                while ((value = fgetc(stdin)) != EOF && value != '\n');
                if (value == EOF)
                    break;
                ++n;
            }
        }
        printf("Sum of Entered Integers = %d\n", sum);
    }

    return 0;
}

正确完成后,您应该能够输入超过个位数的有效整数(即值> 10或<0),以上允许。

答案 2 :(得分:0)

%d的{​​{1}}标记告诉它将输入解释为数字(更确切地说,它表示参数中的指针指向整数类型)。除了将一个整数放入该参数之外,它无法做任何事情。如果它无法将输入解释为数字,scanf会停止扫描输入并立即返回。

正如Jens在上面指出的那样,

scanf将其参数作为字符代码进行评估。但是,isdigit()已将字符代码转换为纯数字。

答案 3 :(得分:0)

从scanf手册页:

On success, the function returns the number of items of the argument list 
successfully filled.

在你的程序中,你试图只从stdin读取一个项目,所以scanf应该返回1.所以检查一下,你就知道这一切都没问题了:

printf("Enter the Number of Integers You Want to Add\n");
while(scanf("%d", &n) != 1) {
    printf("That's not a valid integer.  Please try again.\n");
}

您不能以您使用它的方式使用isdigit(),因为您已经使用scanf将用户输入转换为整数。如果用户没有输入整数,则scanf已经失败。

查看您正在使用的所有C函数的手册页,它们将向您显示函数期望的内容以及在不同情况下返回值的内容。

对于isdigit(),输入应该是一个表示ASCII字符的unsigned char。这可能有点令人困惑,因为ASCII字符实际上表示为一种整数,而字符串是这些字符串的数组。与Python之类的语言不同,它隐藏了你的所有内容。但是数字的STRING(包含数字数字的字符数组)和INTEGER本身之间存在很大差异,INTEGER本身是处理器实际用于数学运算的形式...(简化说明) ,但你明白了)。