2

我编写了这个测试程序来获取 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);
    }

}
4

3 回答 3

4

当输入与格式说明符不匹配时, scanf() 不会丢弃导致无限循环的输入。

 for(;;){
        temp=scanf("%d",&x);
      if(temp == 0) { // Input failure
          perror("invalid input");
          break;
       }
        printf("%i",temp);
    }

如果即使在输入无效后仍想继续循环,则您已读取输入并自行刷新。

于 2013-01-31T22:11:05.893 回答
3

你说scanf要读取一个整数。如果您输入字符串,scanf则将等待整数输入。scanf也不会清除输入,因此它会一遍又一遍地读取相同的内容。您应该检查temp它成功读取某些内容时的值,它将返回成功读取的计数。在你的字符串输入的情况下,它应该返回 0。

此外,根据您的输出位置和使用选项卡输出的外壳,可能会或可能不会忽略或解释不同。

于 2013-01-31T22:07:17.773 回答
3

scanf无法读取您在格式字符串中询问的内容时,它只会将数据留在输入流中,下次它会再次读取它,再次失败,依此类推,直到永远。你应该清空你的输入。

此外,根据标准,您不应依赖 ASCII。但是,是的,'\0'是空字符,您应该使用'\t'硬编码的 ASCII 值来代替。

于 2013-01-31T22:10:51.153 回答