【问题标题】:Why is this loop infinitely repeating?为什么这个循环无限重复?
【发布时间】:2015-03-05 07:23:23
【问题描述】:

此程序的目的是计算字母数字输入中的数字。但是,我使用循环不执行程序,除非输入是字母数字

这是代码:

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

int main(){
   int input,isanum,digitcount;
   printf("\nEnter a number: ");
   scanf("%d",&input);
   isanum=isalnum(input);

   while(isanum==0){
     printf("\nIncorrect input. Try again: ");
     scanf("%d",&input);
     isanum=isalnum(input);
   }
   digitcount=0;
   while(input!=0){
       input=input/10;
       digitcount++;
   }
   printf("\nNumber of digits = %d",digitcount);
   return 0;
}

问题在于循环。它一直无限循环,忽略 scanf 语句,我不知道为什么。我在这里错误地使用了isalnum() 吗?

【问题讨论】:

  • 查看this 线程。
  • 您可能想用 scanf 读取字符,而不是整数。否则,调用 isalnum 没有任何意义。

标签: c while-loop infinite-loop


【解决方案1】:

你需要检查scanf()的返回值。

isalnum() 接受一个字符,但您传递的是一个 int。 '1' 与 C 中的 1 不同。

您可能应该每次消耗一整行,例如使用fgets(),然后检查它是否符合您想要的输入格式,例如sscanf()

就目前而言,您从不消耗任何东西,您只是不断尝试读取一个数字,但那里没有一个数字,因此每次都失败。未能检查 scanf() 的返回值是导致您没有注意到这一点的一个因素。

【讨论】:

  • 你是对的。但我对 fgets() 和 sscanf() 并不十分熟悉,您能否详细说明我如何使用它们来完成此操作?
  • 您使用fgets() 读取一整行。然后将该行传递给sscanf() 或您想要的任何其他函数,例如strtol(),如果您只想读取一个整数(这只是比sscanf() 更简单的方法)。这可以让您确保每次阅读一行,这可能更符合用户的期望。
【解决方案2】:

看看isalnum() 是如何定义的:它需要一个char *。但是,你给它一个int *。数据存储在那里完全不同。

此外,如果您正在阅读 int,您事先知道它将是字母数字,对吧?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2021-08-16
    相关资源
    最近更新 更多