【问题标题】:The program compiles, but when provided with an input, does nothing [duplicate]该程序可以编译,但是当提供输入时,什么都不做[重复]
【发布时间】:2019-07-21 10:23:54
【问题描述】:

我是一名初级程序员(请原谅这个非常基本的问题),我正在通过 Kernighan 和 Ritchie 的书“C 编程语言”学习 C。

我从书中复制了这个程序,它编译得很好,但是当给出输入时,程序什么也不做。

#include <stdio.h>

int main() {
   long nc;

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

输出应该是输入中的字符数,但什么都没有发生

【问题讨论】:

标签: c getchar kernighan-and-ritchie


【解决方案1】:

遇到EOF(=文件结束)条件时会打印输入的字符数。

如果您通过终端提供输入,则文件没有自然结束 所以你需要用一个特殊的键盘快捷键来发出信号,这通常是 Windows 上的 Ctrl+Z 和 Unix 系统(Linux、MacOs ......)上的 Ctrl+D。 (Windows 似乎还要求您在 Ctrl+Z 之前和之后键入 Enter。Ctrl+Z 之前的换行符算作另一个字符,这实际上意味着 Windows 与 Unix 不同,似乎不允许您拥有不以换行符结尾的文本文件,至少在没有 cygwin 的情况下使用 mingw gcc。)

如果您通过重定向提供输入文件,如./a.out &lt; some_file,那么您不必担心这一点,因为文件系统文件具有自然结束。

【讨论】:

  • 所以据我了解,我必须在输入后直接输入 ctrl+z 。不幸的是,当我按下回车键时,它实际上并没有做任何事情。
  • @SamiGhidini Ctrl+Z 然后 Enter 在 Windows 上对我有用。不过,我通常使用 Linux。那里只是 Ctrl+D。
  • 所以当我按 Enter 后,它显然可以工作,然后按 Ctrl+Z 并再次 Enter。显然,问题在于它输出的数字太大了一个字符。你知道这是为什么吗?
  • 糟糕。我错过了那部分。是的,在 Windows 上似乎需要 Ctrl+Z 之前的换行符。换行符确实算作另一个字符,因此增加了计数,不幸的是,C 标准确实允许 Windows 要求它,因为根据 C 标准“最后一行是否需要终止换行符是实现定义的。” (port70.net/~nsz/c/c11/n1570.html#7.21.2p2)。我建议在 Linux 或至少 Cygwin 上学习 C。 C 在 Unix 上更熟悉一些,而且 Ctrl+D 简单地工作,你不必在前后都弄乱 Enter 。
【解决方案2】:

您应该使用 EOF 指示符结束流,在 Windows 上为 CTRL+Z,在基于 Linux 的操作系统上为 CTRL+D。当getchar()读取EOF时,存在while循环,字符数输出到stdout

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    相关资源
    最近更新 更多