我编写了这个测试程序来获取scanf()函数的返回值。
然而在测试中,如果我输入一个整数,程序是正常的,但是当我输入一个字符串时,它将进入无限循环。谁可以解释原因?
另一件事就是转义字符\ 0代表ascii代码0?当我打印“\ 12”时,我会得到一个新行,但是当我打印“\ 9”时,我无法获得“TAB”(TAB的ascii代码为9)。
#include <stdio.h>
int main(void){
int x;
int temp;
//printf("\13");
for(;;){
temp=scanf("%d",&x);
printf("%i",temp);
}
}
答案 0 :(得分:4)
当输入与格式说明符不匹配时,scanf()不会丢弃导致无限循环的输入。
for(;;){
temp=scanf("%d",&x);
if(temp == 0) { // Input failure
perror("invalid input");
break;
}
printf("%i",temp);
}
如果您仍想在无效输入后继续循环,您已阅读输入并自行冲洗。
答案 1 :(得分:3)
你告诉scanf
读取一个整数。如果输入字符串,scanf
将等待整数输入。 scanf
也不会清除输入,因此它会一遍又一遍地读取相同的内容。你应该检查temp
的值,当它成功读取它会返回成功读取的数量。在你的情况下,在字符串输入它应该返回0。
另外,根据您输出的位置和您使用的shell,选项卡输出可能会被忽略,也可能不会被忽略或解释。
答案 2 :(得分:3)
当scanf
无法读取格式字符串中的内容时,它只会将数据保留在输入流中,下次再次读取它,再次失败,依此类推,永远。你应该清空输入。
另外,根据标准,你不应该依赖ASCII。但是,'\0'
是空字符,您应该使用'\t'
而不是硬编码的ASCII值。