在同一行中包含Ctrl + Z后,getchar()继续接受输入

时间:2015-07-14 12:53:28

标签: c getchar

接受并打印角色的简单c程序。

int c;
while((c=getchar())!=EOF)
{
  putchar(c);
}

当我在行尾按Ctrl + Z时,我无法接受为什么它接受输入 你好(按Ctrl + Z)    你好(一些符号) 但是在离开线然后按Ctrl + Z后它才能正常工作。 我正在使用Window 7

Ouput

5 个答案:

答案 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中的这个答案让它更清楚

https://unix.stackexchange.com/a/177662/6555

答案 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)