首页>Program>source

代码:

#include <stdio.h>
#define NEWLINE '\n'
#define SPACE ' '
int main(void)
{
    int ch;
    int count = 0;
    while((ch = getchar()) != EOF)
    {
        if(ch != NEWLINE  && ch != SPACE)
            count++;
    }
    printf("There are %d characters input\n" , count);
    return 0;
}

问题:

  1. 一切正常,它将忽略空格和换行符,并将输入的字符数输出到屏幕上(在此程序中,我只将逗号,感叹号,数字或任何可print的特殊符号字符(例如与号)视为字符 也是如此)当我点击 ^z的EOF模拟时

  2. 但是当我在程序中输入这一行时出了点问题.例如,我输入以下内容: abcdefg^z ,这表示我在 ^z之前和同一行输入了一些字符 .该程序将继续要求输入,而不是终止程序并print出总字符。

  3. 仅当我指定 ^z时,EOF终止字符输入才有效 在一行上或通过执行以下操作: ^zabvcjdjsjsj .为什么会这样?

最新回答
  • 2021-1-11
    1 #

    几乎在每个终端驱动程序中都是如此.使用Linux,您将获得相同的行为.

    您的程序直到 \n才真正执行循环 或 ^z 您已在行尾输入.终端驱动程序正在缓冲输入,直到发生输入才将其发送到您的进程。

    在一行的结尾,点击 ^z (或 ^d 在Linux上)not不会导致终端驱动程序发送EOF.它只会使它刷新缓冲区到您的进程(没有 \n ).

    打威兹维兹 (或 ^z 在Linux上)在行首被终端解释为"我想发信号EOF"。

    如果在循环中添加以下内容,则可以观察到此行为:

    ^d
    

    运行程序:

    printf("%d\n",ch);
    

    要更好地理解这一点,您必须意识到EOF不是字符. $ ./test abc <- type "abc" and hit "enter" 97 98 99 10 abc97 <- type "abc" and hit "^z" 98 99 是用于终端本身的用户命令.因为终端负责接收用户输入并将其传递给流程,所以这变得很棘手,从而造成混乱.

    一种查看方式是点击 ^z 然后点击 ^v 作为程序的输入。

    ^z 是另一个告诉终端的终端命令,"嘿,我键入的下一件事-不要将其解释为终端命令;而是将其传递到进程的输入"。

  • 2021-1-11
    2 #

    ^v 仅当在行首键入时,控制台才将它转换为程序的EOF信号.这就是windows控制台的工作方式.我所知道的这种行为没有"解决方法"。

    ^Z

相关问题

  • multithreading:如何从另一个线程暂停和恢复Java中的线程
  • c#:使用动态密钥反序列化JSON