C 编程 - K&R 示例 1.5.2 - 修改后的程序未按预期运行

2023-12-28

我的问题很简单:“为什么第 10 行和第 11 行的代码无法正常运行?”我的代码的预期目的是完全按照原始 K&R 代码的预期进行操作,但每当 (getchar() == '\n') 时都不计算 nc ,请您赐教吗?

稍微修改一下K&R代码:

/** K&R - 1.5.2 Character Counting **/
#include <stdio.h>

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

  nc = 0;
  while (getchar() != EOF){
    if (getchar() != '\n'){
      ++nc;
    }
  }
  printf("%ld\n", nc);
}

我使用 64 位 Windows 7、CodeBlocks10.05、GNU GCC 编译器。

我目前的进展和理解:

在示例运行中,我输入单词two然后按 Enter 键,相当于 4 个输入,然后按 ctrl+Z 输入 a^Z或 EOF 字符。然后程序打印1。我期待它打印出来3。我想唯一合乎逻辑的解释是它所做的与我的意图完全相反(它only计算换行符?)。事实证明,如果我输入这个词two然后按 Enter 键,假设 4 次,它会打印4。似乎正在数数nc对于输入的每个换行符,但如果我单独按 Enter 键(在本例中按 4 次),然后按 EOF,它总是打印0。经过进一步的实验,通过一些看不见的人,4 对于这个程序来说可能是一个神奇的数字。如果我启动它并准确地按 Enter 键(可被 4 整除的数字)次,然后打印 EOF0。但是,如果我按其他次数输入 EOF 则不会执行任何操作,并且我必须输入^Z两行,一前一后,正确结束 while 循环,并打印1。这让我很困惑!


问题是你需要保存其中的值getchar()– 在一个int– 因为每次增加计数时您都会读取两个字符。其中之一是 EOF 测试;第二个是换行测试。

int c;

while ((c = getchar()) != EOF)
{
    if (c != '\n')
        ++nc;
}

您需要存储结果的原因getchar() in an int而不是一个char是它可以返回所有可能的charvalue 也是一个独特的值 EOF。如果你不使用int(您直接存储到char),将会发生以下两种情况之一:

  1. If char是有符号类型,合法字符(通常是 y 元音变音、ÿ、带有分音符号的拉丁文小写字母 Y、U+00FF — 至少在源自拉丁语 1 或 ISO 8859-1 的代码集中)将被解释为等效于 EOF,并且你的程序将提前终止。
  2. If char是无符号类型,任何字符都不会等于 EOF,因此程序永远不会停止循环。

这两种情况都是不可取的。存储返回值getchar() in an int防止这两个问题;这是“唯一”(或者至少是最简单)的正确方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 编程 - K&R 示例 1.5.2 - 修改后的程序未按预期运行 的相关文章