c - 使用 isalpha() 导致文本转储

标签 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?我应该使用不同的循环吗?我应该以其他方式验证输入吗?

最佳答案

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

要修复您的代码,entry 应该是 char 并且 scanf 必须使用 %c 来扫描它.或者,如果您希望 entry 为整数,请检查 scanf 是否返回 0。如果返回 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
} 

关于c - 使用 isalpha() 导致文本转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27262392/

相关文章:

html - 在提交表单之前,我如何要求至少选中一个复选框?

c++ - 每 x 秒运行一次代码,无论在循环内执行多长时间

c - 在 C 中追加到文件开头

c - C中的Knuth列表插入方法

string - GCC 编译器的问题

c# - 使用属性属性在MVVM中进行验证

用于检查用户名可用性的 Javascript 帖子不起作用

javascript - 内循环显然被卡住了

java - 循环遍历方向

c++ - 如何防止用户在C和C++项目之间的公共(public)头文件中编写C++代码?