关于C中scanf()的一些问题

时间:2013-01-31 22:05:25

标签: c scanf

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

}

3 个答案:

答案 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值。