【问题标题】:getchar example from K&R C does not work properly来自 K&R C 的 getchar 示例无法正常工作
【发布时间】:2015-06-29 14:41:40
【问题描述】:

我想知道 K&R C 的这段代码发生了什么:

#include <stdio.h>

int main() {
    double nc;

    for (nc = 0; getchar(); ++nc) {
        ;
    }
    printf("%.0f\n", nc);
}

当我运行代码 (OS X El Capitan) 时,for 循环没有完成,我无法进入 printf 语句。

【问题讨论】:

  • 签出getchar
  • 你要终止输入流吗?
  • 是的,我输入完成
  • 澄清一下,您的程序正在等待输入。如果它在其标准输入连接到终端的情况下运行,这意味着它正在等待您输入内容并关闭流(在 *nix 上,使用 ctrl-d)。尝试从文件重定向输入。 ./a.out &lt; file.txt
  • enter 不会关闭流,它只是写一个换行符。

标签: c


【解决方案1】:

getchar() 成功返回获取的字符,失败返回EOF。参考here

试试这个

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

请注意,Enter 不是EOF,而是换行或'\n'

看标题stdio.h,说,

#define EOF (-1)

Here你可以看到如何模拟一个EOF。

Windows: Ctrl+Z
Unix :   Ctrl+D

长话短说,您可以在for 循环中放置任何条件,例如

for (nc = 0; getchar() != '\n'; ++nc) { } // break the loop if enter pressed
for (nc = 0; getchar() != 'c'; ++nc) { } // break the loop if c pressed
.
.
.

【讨论】:

  • 这需要一个分号或者像for (nc = 0; getchar() != EOF; ++nc) {}这样的空块,实际上比分号更好。
  • @egarro,我为你添加了更多信息,看看。
  • @rakeb.void:非常感谢!
【解决方案2】:

getchar() 等待来自标准输入的输入,即使您输入任何字符,getchar() 也会读取它,但这不会让您跳出循环。

所以你需要在getchar()的返回值上添加一些条件来优雅地退出循环。

例如:

for(;getchar() != EOF;)
{
}

如果你想返回换行符,那么检查应该是getchar() != '\n'

PS:我刚刚展示了如何检查返回值,对我来说退出条件是EOF,它可能因您而异。

【讨论】:

  • @KarolyHorvath 为了避免混淆,我去掉了它
  • egarro 如果它仍然“不工作”,您可能忽略了关闭输入流的建议。
  • EOF和“\n”有什么区别?
  • @egarro:文件结尾和行尾有什么区别?几乎所有东西......
【解决方案3】:

这个循环

for (nc = 0; getchar(); ++nc) {
        ;

将迭代直到 getchar() 返回 0。要在不重写程序的情况下实现这一点,因为其他人建议您应该例如在 Windows 中按组合键 Ctrl + @,然后按 Enter。组合键Ctrl + @的值等于0。

【讨论】:

  • 或例如。 echo -e "foo\0" | ./a.out 在 Linux 上
【解决方案4】:

如果你修改你的代码来实现它:

#include <stdio.h>

int main() {
    double nc;

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

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

然后如果你在终端窗口中运行它并输入以下内容:

abcCtrl-D

你会得到输出:

abc
3

(Ctrl-D是EOF字符)

【讨论】:

  • "Ctrl-D 是 EOF 字符" .. 对于 Unix。不适用于 Windows。为什么要输入两次?为什么要改变nc的类型?
  • Olaf - 提问者使用的是 OS X,我假设在终端窗口中,但我承认我可能错了。
  • 这只是Windows-unsers读到的;这可能会引发另一个不必要的投诉。但是,我删除了反对票,因为我主要关心的是更改的类型-实际上,我完全理解;必须先检查自己是否真的允许浮点类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 2021-06-13
  • 1970-01-01
  • 2020-06-30
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多