如果用户在查找整数的scanf中输入char,我该如何避免deadloop?

我一直在网上搜索一段时间,却没有找到令人满意的答案。 现在我在这里试试运气。 所以这里:

在我的程序中,我希望用户通过终端输入一个数字,为​​此我使用scanf()。 相当简单,我知道……而且我已经做到了。 但我也想让它“白痴”。 因此,我试图确保如果用户输入一个字符而不是一个整数,程序将不会死循环。 就像现在一样,如果输入一个角色,程序将会死循环。

我的代码是:

long fs = 0; printf("Enter the samplefrequency(in Hz) and press 'ENTER': "); while(fs<=0) { scanf(" %li", &fs); if(fs <= 0) { printf("\nThe samplefrequency must be above 0 Hz. Please enter again: "); } } 

这将继续在if语句中打印该行。 我该如何避免这种情况?

从控制台进行用户输入的唯一方法是完全无懈可击的是:

  • 不要使用scanf 。
  • 使用fgets将输入作为字符串读取。 不要将它读作整数。
  • 解析此字符串并查看它是否包含有效数字。
  • 使用strtol()将字符串转换为整数。

像这样改变它:

 scanf(" %li", &fs); while(fs <= 0) { printf("\nThe samplefrequency must be above 0 Hz. Please enter again: "); scanf(" %li", &fs); } 

当您输入错误的数字时,循环将继续提示输入新的数字,直到它正确为止。

这是一个演示如何使用fgetssscanf来解决用户输入问题的示例。

函数getInputFromUser显示prompt1 ,然后使用fgets从用户读取一行输入。 (如果fgets返回NULL ,则表示来自用户的文件结束,程序将中止。)

然后该函数使用sscanf将输入转换为数字。 sscanf返回成功转换的次数,因此在此示例中,返回值1表示sscanf成功。 (可以在sscanf之后执行附加范围检查以确保该数字是可接受的。)如果sscanf失败,则显示第二个提示( prompt2 )并且该function再次尝试。

如果用户到处输入有效数字,该函数将返回该值。

 long getInputFromUser(char *prompt1, char *prompt2) { long result = 0; char line[100]; printf("%s", prompt1); for (;;) { if (fgets(line, sizeof(line), stdin) == NULL) { // user hit the EOF key printf( "\nterminated by user...\n" ); exit(1); } if (sscanf( line, "%ld", &result) == 1 && result > 0) break; printf("%s", prompt2); } return result; } 

使用初始提示调用该函数,并重新提示该用户

 long fs = getInputFromUser("Enter the samplefrequency(in Hz) and press 'ENTER': ", "The samplefrequency must be above 0 Hz. Please enter again: ");