C:scanf和printf的问题

时间:2014-02-11 18:41:03

标签: c printf scanf

我遇到了接受用户输入和在C中打印其ascii值的问题。我的任务是编写一个程序,它只需要一个char作为输入并输出其ascii值,并且只在用户输出时停止输入0(ascii值为0为48)。我的问题是,如果printf似乎在scanf后面有一个循环。

while(x == 1){
    scanf("%c\n",&thisChar);
    ascii = thisChar;
    if(ascii == 48){
        x = -1;
    }
    printf("Ascii: %d\n", ascii);
}

例如,当我从命令行运行它时,我会得到这样的结果:

f  
0  
Ascii: 102  
f  
Ascii: 48  

然后程序结束。使用相同的输入,我希望输出为:

f  
Ascii: 102  
0  
Ascii: 48  

然后结束那里。我的逻辑错误是什么?

3 个答案:

答案 0 :(得分:2)

\n字符是您问题的根本原因 改变

 scanf("%c\n",&thisChar);  

 scanf(" %c",&thisChar);  

编辑:OP询问为什么%c scanf之前的空格在输出方面很重要?

当您将数据输入到程序并按 Enter 键时,会将额外的字符\n与输入数据一起传递到输入缓冲区。例如:如果要在程序中输入f,则在按 Enter 键时,输入缓冲区包含f\n。在循环的第一次迭代中,f读取字符scanf,留下缓冲区中的\n。在下一次循环迭代中,\n会读取scanf,从而导致意外输出 要解决此问题,您需要在下次阅读之前使用此\n。在%c中的scanf说明符之前放置一个空格可以使用任意数量的换行符。

答案 1 :(得分:0)

您是否考虑仅使用getchar(3)? (可能需要fflush(3))...终端中的 stdin 也是一个复杂的野兽。请参阅tty demystified

内核(不仅是libc)有点缓冲每个tty行(参见line discipline)。

另请参阅ncursesGNU readline

答案 2 :(得分:0)

不要在scanf()中使用\ n。

删除“\ n”并执行