接受并打印角色的简单c程序。
int c;
while((c=getchar())!=EOF)
{
putchar(c);
}
当我在行尾按Ctrl + Z时,我无法接受为什么它接受输入 你好(按Ctrl + Z) 你好(一些符号) 但是在离开线然后按Ctrl + Z后它才能正常工作。 我正在使用Window 7
答案 0 :(得分:3)
当您致电getchar()
时,它最终会进行read()
系统调用。 read()
将阻止,直到它有一些字符可用。当您按下返回键或表示输入结束的键时,终端驱动程序仅使字符可用。至少这是它的样子。实际上,它涉及的更多。
假设通过ctrl-Z表示无论击键组合是什么意思"输入结束",原因是read()
系统调用的工作方式。 ctrl-D(它在大多数Unix上的ctrl-D)字符并不意味着"输入结束",它意味着"将当前待处理的输入发送到应用程序&# 34 ;.
如果您在按ctrl-D之前键入了某些内容,则该输入会被发送到可能在read()
系统调用中被阻止的应用程序。 read()
使用输入填充缓冲区并返回它放入缓冲区的字节数。
当您按下ctrl-D而没有任何输入待处理时(即您执行的最后一件事是return
或ctrl-D),同样的事情发生但没有字符,因此read()
返回0。 read()
返回0是输入结束的约定。当getchar()
看到此内容时,它会将EOF
返回给调用程序。
Stack Exchange中的这个答案让它更清楚
答案 1 :(得分:1)
您还没有说过您正在使用的系统,[U | Li] nix或Windows。这个答案是Windows特定的。对于[Li | U] nix,用ctrl-d替换对ctrl-z的引用。
使用终端时,Ctrl-z不会产生EOF(-1)(详见Haccks& JeremyP的详细解答),因此循环不会以你编写的方式退出。但是,您可以在while循环条件中对ctrl-z进行测试以退出...
int main ()
{
int c=0;
puts ("Enter text. ctrl-z to exit:");
while(c != 26) //(26 is the ASCII value for ctrl-z)
{
putchar(c);
c = getchar();
}
return 0;
}
顺便说一下, here is a table showing the values for ASCII control characters.
答案 2 :(得分:0)
我在wiki找到答案:
在Microsoft的DOS和Windows (以及在CP / M和许多DEC操作系统中),从终端读取将永远不会产生
EOF
。相反,程序认识到源是终端(或其他"字符设备")并将给定的保留字符或序列解释为文件结束指示符;最常见的是ASCII Control-Z,代码26 。
答案 3 :(得分:-1)
#include <stdio.h>
int main()
{
int c;
while((c=getchar())!=26)
{
putchar(c);
}
}
您可以使用ASCII
CTRL-Z
的值。现在按CTRL-Z
后不会输入。
答案 4 :(得分:-1)
getchar()fution通过按Ctrl + Z读取单个字符将TSTP信号发送到您的进程,意味着终止进程(unix / linux)