如果用户在查找整数的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); }
当您输入错误的数字时,循环将继续提示输入新的数字,直到它正确为止。
这是一个演示如何使用fgets
和sscanf
来解决用户输入问题的示例。
函数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: ");