我从输入中读取字符时遇到问题。当我按ENTER或CTRL + Z时,程序应该结束。
示例输入: LoreCTRL + Z ....正在骑自行车 但是当我按下CTRL + Z并且之前没有文字时,它可以工作。 有人能帮助我吗?感谢
int intFromConsole = getchar();
if((intFromConsole == EOF) || (intFromConsole == '\n')){
//code
}
答案 0 :(得分:2)
这可能与您的程序无关,而是与负责该行为的终端子系统(在内核中)无关。
您的终端通常处于"线路纪律"州。请注意,您的程序没有收到" Lore"直接,但只有当你按回车。 (输入是行缓冲的)。
另一个问题是,您通常不应期望Ctrl + Z(ASCII 26)作为输入,因为它在大多数终端状态下被终端子系统拦截,这会暂停您的程序并将其发送到后台。
您可以从Linus Akesson的文章The TTY demystified获取更多有趣的信息。
答案 1 :(得分:1)
函数getchar()
使用缓冲输入。在Windows中,Ctrl-Z
仅在newline
条目后才会被识别。但在Windows中,您可能在库中可以使用conio.h
。如果是这样,这里有一些东西供你试验。它立即接受每次击键,并以十六进制格式打印。它会在按下Ctrl-Z
时退出。
#include <stdio.h>
#include <conio.h>
#define ENDOF 0x1A // Ctrl-Z
int main(void) {
int ch;
do {
ch = _getch();
printf("%02X\n", ch);
} while(ch != ENDOF);
}
节目输入
1234<Ctrl-Z>
节目输出
31
32
33
34
1A
答案 2 :(得分:0)
当我按ENTER或CTRL + Z时,程序应该结束。
如果符合您的要求,您可以执行以下操作:
int main(void)
{
char ch;
do
{
while(ch!='\n')
getchar(); // waste the buffer
/* Do the useful stuff here */
ch=getchar();
}while(ch!=EOF && ch!='\n');
/* Note the logical operator is && . It says if the key pressed
* is neither Enter nor Ctrl -Z do some stuff.
* The program exits only when you directly press Enter key or
* Ctrl -Z / Ctrl -D. Okay ! Now it is time to take a nice walk
* thru the Grand Central Park.
*/
return 0;
}
对于Linux机器,Ctrl-Z生成无法捕获的SIGSTOP。因此,要发出EOF信号,您应该使用Ctrl-D。
参考文献: