我遇到了接受用户输入和在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
然后结束那里。我的逻辑错误是什么?
答案 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)。
另请参阅ncurses和GNU readline。
答案 2 :(得分:0)
不要在scanf()中使用\ n。
删除“\ n”并执行