【问题标题】:Does ctrl+z count as a character in a program to count the number of charactersctrl+z 是否算作程序中的一个字符来统计字符数
【发布时间】:2023-10-19 13:00:01
【问题描述】:

下面是一个统计字符数的程序:

#include<stdio.h>
main()
{
    long nc;
    nc = 0;
    while(getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);
}

正如我们在这里看到的那样-Why does getchar() recognize EOF only in the beginning of a line? ctrl+z 在一行字符内写入时不被视为 EOF,仅在写入时才被视为 EOF在行首。

所以这些是程序的以下输出:

123
abs
^Z
8

这里程序返回 8 表示它也在计算 '\n'。

123^Z
abs^Z
^Z
8

它再次返回 8 那么程序在这里做什么呢?它要么忽略 ^Z 作为字符,要么不计算 ^Z 之后的 '\n'。

abc^Zaa
^Z
4

这里程序返回 4,所以这意味着它没有在 ctrl+Z 之后计算 aa。所以我想知道它是否不计算 ^Z 之后的任何字符,或者它也不计算 ^Z 而是计算每行末尾的换行符。那么可以说这里的^Z也起到了行尾的作用吗?

【问题讨论】:

  • 问题更多是关于键盘接口和驱动程序而不是 C:什么键算作 字符。 Keys Ctr Z 变成字符 '\1A' 或在不同条件下发出“文件结束”信号。
  • 建议打印getchar() 返回的值以获得更深入的了解。 int c; while((c = getchar()) != EOF) printf("%d %d\n", ++nc, c);
  • 另外,1999 年是 19 年前 - 你应该编写标准 C,而不是一些史前变体 - int main(void)。或许还有@chux,printf("%d %hhu", ++nc, (unsigned char)c)
  • 回想一下这些是 control 字符。当它们控制输入时,它们的作用是与其他字符不同。精确的功能因计算机而异。

标签: c eof


【解决方案1】:

这可能取决于您的操作系统,但通常在行首表示关闭输入流并在行中间刷新输入流。因此,在任何情况下,您的控制字符都可用于输入(除非您修改终端行为)。试试这个,你会看到:

int c;
while((c=getchar()) != EOF) {
    ++nc;
    printf("read ascii code %d\n",c);
}

【讨论】:

  • 但是刷新输入流是什么意思
  • 这是另一个问题,但是输入字符在您输入它们时不可用,只有在终端输入缓冲区被刷新时(当它已满时,当您输入 并且当您强制冲洗)。
最近更新 更多