【问题标题】:getchar() function to count characters in Cgetchar() 函数用于计算 C 中的字符数
【发布时间】:2019-10-24 03:17:48
【问题描述】:

我有一个计算字符数的代码。它使用 getchar() 并且在执行时我使用 (./a.out

当我使用条件时,

while((c = getchar()) != EOF && c != '\n')

而不是

while((c = getchar()) != EOF)

在c是main中定义的int的函数中,计数器是正确的。

int main() 
{
    long nc=0; int c;
    while((c = getchar()) != EOF)
    {
        putchar(c);
        ++nc;
    }
    printf("%ld", nc);
}

我认为问题是由于 '\n' 字符。当我如上所示使用 putchar(c) 时,假设我的 test.txt 文件中有 9 个字符。现在,它应该打印文件中的所有字符,后跟 9 作为输出。但是,它会打印 10。此外,命令提示符在显示字符后转移到下一行,这是打印 10 的原因,因为它将 '\n' 计为一个字符。但是,那个 '\n' 是从哪里来的呢?

【问题讨论】:

  • 文件的内容是什么?什么是预期的输出?实际输出是多少?
  • 问题可能是编辑器默认在文件末尾添加了一个新行(甚至是VIM!)
  • 我随机输入了一些字符;确切的文本是“hsfiefefd”,不带引号,由 9 个字符组成。
  • getchar() 获取 ANSI 字符。它可能会得到UTF 字母作为最多四个不同的字符。
  • 当心,如果你曾经在 Windows 上尝试过:换行符被编码为两个字符 '\r' 和 '\n',但通常 getchar() 只会给你 '\n'。如果您的编辑器以 UTF 格式存储,则开头可能有一个 BOM,需要一些字节。

标签: c getchar


【解决方案1】:

我敢打赌,您实际上并没有验证文件的大小。仔细检查尺寸

ls -ls test.txt

wc -c test.txt

在十六进制编辑器中打开您的文件。我怀疑你会在最后找到一个换行符 (0x0A)。

但是,'\n' 是从哪里来的呢?

这首先取决于您创建或编辑文件的方式。

如果您是使用创建的

echo "Test file" > test.txt

例如,bash 将自动在末尾添加一个换行符。某些文本编辑器可能会这样做。

【讨论】:

  • 我使用十六进制编辑器打开它。它的输出末尾有 0A,但在字符中,它显示一个“。”到底。这是否代表换行符?
  • @Kuljeet:是的。 hexedit 程序 - 可能还有其他十六进制编辑器 - 将 . 用于无法打印的字符(例如,换行符、换行符等控制字符)。
猜你喜欢
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2013-11-02
  • 2023-03-28
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 2019-08-11
相关资源
最近更新 更多