我尝试使用isalpha()
验证输入并确保它不是字母。我试图正确使用它,但我想我可能会遗漏一些东西。
有问题的部分:
scanf("%i", &entry);
while (entry != 0) {
if (isalpha(entry)) {
printf("That isn't a number\n");
printf("Please type a number or \"0\" to quit\n");
scanf("%i", &entry);
} else {
// Do code stuff
}
当我使用数字时,代码运行完美,但是当我为entry
添加一个字母时,代码只会转储所有其他行。我是否必须将entry
重新声明为int?我应该使用不同的循环吗?我应该以另一种方式验证输入吗?
答案 0 :(得分:2)
isalpha
检查字符是否为字母。当您输入的整数与字母表的ASCII value不对应时,如果输入的整数为EOF
或者在unsigned char
范围内,则返回false,否则,代码将显示未定义的行为。
要修复代码,entry
应该是char
而scanf
必须使用%c
进行扫描。或者,如果您希望entry
为整数,请检查scanf
是否返回0.如果是,scanf
无法扫描整数,因为用户已输入其他内容。您的代码将如下所示:
while((scanf("%d", &entry))==0) //scanf failed to scan an int
{
printf("That isn't a number\n");
printf("Please type a number or \"0\" to quit\n");
scanf("%*s");//remove the invalid character(s) from the stdin
}
答案 1 :(得分:1)
无效使用isalpha()
int isalpha(int c)
是针对int
范围和unsigned char
中的所有EOF
值定义的。任何其他值都会导致未定义的行为(UB)。
当OP输入scanf("%i", &entry)
的字母时,scanf()
返回0.遗憾的是,代码未检查此返回值。因此,entry
中的值未定义,错误值可能会传递给isalpha()
。
int entry;
int cnt;
cnt = scanf("%i", &entry);
if (cnt != 1) {
printf("Integer not entered. Returned count:\n", cnt);
} else if (((unsigned char) entry != entry) && (entry != EOF)) {
printf("Integer entered is not in range. entry::\n", entry);
} else if (isalpha(entry)) {
printf("Character code %d is an alpha and is represented by %c\n", entry, entry);
} else {
printf("Character code %d is not an alpha\n", entry);
}