【问题标题】:"C programming language" - Counting characters anomaly?“C 编程语言” - 计数字符异常?
【发布时间】:2019-01-06 02:41:06
【问题描述】:

Ritchie & Kernighan 的 C 编程语言书中,在 §1.5.2 计数字符中,给出了程序的两个版本:

#include <stdio.h>

/* count characters in input; 1st version */
int main() {
    long nc;
    nc = 0;

    while (getchar() != EOF)
    {
        ++nc;
    }

    printf("%ld\n", nc);
}

#include <stdio.h>

/* count characters in input; 2nd version */
int main() {
    double nc;

    for (nc = 0; getchar() != EOF; ++nc) {
        ; // null statement
    }

    printf("%.0f\n", nc); 
}

它们都可以编译和工作,但总是输出比实际字数多一个字符。

例子:

"milestone" (9 characters) outputs 10  
"hello, world" (12 characters) outputs 13

这是为什么?
是计算'\0' 字符还是我在键盘上按 Return 时给出的'\n'

仅供参考:我在 MacOS 10.13.5 的终端上运行所有这些,并且文本已在 Atom 中输入。

【问题讨论】:

  • 查看正在发生的事情的一种方法是在每个循环中打印出字符的值,这应该为接受第二个假设提供相当可靠的证据。 (没有从键盘读取'\0'字符--)
  • @user2864740:您通常可以键入 control-@ 以从键盘输入空字节。仅供参考——不太可能在这种情况下输入。
  • 一种简单的查找方法,只在getchar() != '\n'而不是EOF循环,看看它是否会输出预期的结果。另外,如果您要计算整数,为什么要使用double?我怀疑你会遇到半个字符。
  • @Havenard 我正在关注 Ritchie & Kernighan 的书。他说在某些机器上 Int 只有 16 位,所以 Double 会给我们更多的“力量”。
  • @NeeratheWildMage 好吧,就像在编码微控制器或其他东西时,即使在那里你也应该找到支持 32 位的类型,如 long。据我所知long 将始终至少为 32 位,即使在编码 8 位微控制器时也是如此。重要的是要记住,这种“力量”是以更多内存为代价的,when you have 25 bytes of RAM available 你不能分配你不需要的位。

标签: c output character counting


【解决方案1】:

因为\n 也被计算在内,所以它算“多一个”。

例如:

echo -n "asdf" | ./a.out

输出:

4

但是有一个换行符:

echo "asdf" | ./a.out

输出

5

【讨论】:

  • 您在终端中的代码输出此-bash: ./a.out: No such file or directory
  • 我假设你编译了你提供的代码的一个版本,没有参数。因此二进制文件a.out 将被编译和链接。另外,我的echo 版本有-n 开关,用于禁用回显尾随换行符。
  • 我复制了与您完全相同的代码echo -n "asdf" | ./a.out这就是终端告诉我的...
  • @NeeratheWildMage 将a.out替换为已编译程序的名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
相关资源
最近更新 更多