使用isalpha()会导致文本转储

时间:2014-12-03 01:59:23

标签: c validation loops char dump

我尝试使用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?我应该使用不同的循环吗?我应该以另一种方式验证输入吗?

2 个答案:

答案 0 :(得分:2)

isalpha检查字符是否为字母。当您输入的整数与字母表的ASCII value不对应时,如果输入的整数为EOF或者在unsigned char范围内,则返回false,否则,代码将显示未定义的行为。

要修复代码,entry应该是charscanf必须使用%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);
}