我一直在努力增加一些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(),它不会将任何输入识别为整数,无论它是否。有什么我只是做错了吗?
答案 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)
isdigit
和isalpha
都不像您认为的那样工作。这些库函数的目的是检查给定的代码点(表示为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
会停止扫描输入并立即返回。
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本身是处理器实际用于数学运算的形式...(简化说明) ,但你明白了)。