【问题标题】:Counting number of user input using getchar() gives double the expected result, why?使用 getchar() 计算用户输入的数量会得到预期结果的两倍,为什么?
【发布时间】:2016-09-14 18:46:25
【问题描述】:

在下面的例子中,来自《C编程》一书,当输入字符时,程序会计数两次。

main(){

long nc;

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

输出:

a
b
c
d
e
f
12

怎么了?

我正在使用 Ubuntu 和 gcc 编译器。

【问题讨论】:

  • main() 是一个已弃用的签名。永远不要使用它!在此处使用原型样式签名:int main(void)。学习现代 C(即 C99)。
  • 从技术上讲,这个程序也被破坏了,因为它在main 的末尾缺少一个return 0。从 C99 开始,您需要明确的 int main,但 return 是可选的。 :-)
  • 输出正确。使用该输入创建一个文件并将其通过管道传输到您的程序。然后比较文件长度和输出。您可能还想在文件上使用十六进制编辑器来查看发生了什么

标签: c loops getchar


【解决方案1】:

计数正确。 getchar() 正在考虑按下 ENTER 键,作为换行符 \n。所以 6 个 user 输入和 6 个换行符。计数匹配。

如果您不希望将换行符计为输入,则需要在getchar() 返回值不是\n 时增加计数器,类似于

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

将完成工作。注意,c 应该是 int 类型才能处理 EOF

也就是说,根据C99C11,对于托管环境,main() 的签名至少应为int main(void) 以符合标准。

【讨论】:

  • 谢谢。我在阅读中遗漏了一些东西,或者书中没有提到这种奇怪的行为。
  • @carlitos_30 这本书可能不希望您每隔一段时间就按 Enter 键。
  • 一点也不奇怪。它只是告诉您输入的每个字符。您会发现与 scanf("%c", &ch); 相同的行为
  • 再次感谢,先生。
  • @carlitos_30 不客气。你也可以consider accepting any one of the answers that helped you
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多