#include <stdio.h>
int main() {
char read = ' ';
while ((read = getchar()) != '\n') {
putchar(read);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的输入是f(当然是输入).我希望getchar()再次请求输入,但程序终止.怎么会?我怎样才能解决这个问题?
终端有时会有点混乱.您应该将程序更改为:
#include <stdio.h>
int main() {
int read;
while ((read = getchar()) != EOF) {
putchar(read);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这将读取直到getchar从终端读取EOF(大多数时候此宏扩展为-1).getchar返回一个int,因此你应该将变量'read'变成一个整数,这样你就可以检查EOF.您可以使用^ D从Linux上的终端发送EOF,我想在带有^ Z(?)的Windows上.
稍微解释会发生什么.在你的程序中表达
(read = getchar()) !='\n'
Run Code Online (Sandbox Code Playgroud)
只要没有从缓冲区中读取'\n',它就是真的.问题是,要将缓冲区添加到程序中,必须按Enter键对应'\n'.在终端中调用程序时,会发生以下步骤:
~$\a.out
Run Code Online (Sandbox Code Playgroud)
这开始你的程序
(empty line)
Run Code Online (Sandbox Code Playgroud)
getchar()进行系统调用以从终端获取输入并且终端接管
f
Run Code Online (Sandbox Code Playgroud)
你在终端做了一个输入.'f'被写入缓冲区并在终端上回显,你的程序还不知道该字符.
f
f~$
Run Code Online (Sandbox Code Playgroud)
你点击进入.你的缓冲区现在包含'f \n'.'enter'也向终端发出信号,它应该返回你的程序.你的程序读取缓冲区并找到f并将其放到屏幕上,然后找到一个'\n'和immediatley停止循环并结束你的程序.
这将是大多数终端的标准行为.您可以更改此行为,但这取决于您的操作系统.
| 归档时间: |
|
| 查看次数: |
5797 次 |
| 最近记录: |