C 初学者 for 循环输出问题

C beginner for-loop output issue

提问人:programmeurNED 提问时间:5/14/2020 最后编辑:RobertS supports Monica CellioprogrammeurNED 更新时间:5/14/2020 访问量:264

问:

我是C(自学)的新手。 当我执行这个for循环函数时,当我输入“hello”时,输出将是012345。但是,它会跳到 for 循环之外的最后一个打印功能?

int main() {

    int c;


    for (c = 0; getchar() != EOF; ++c) {
        printf("%d\n", c);
    }

    printf("%d\n", c);

    return 0;
}


输出:

hello
0
1
2
3
4
5

C for-loop EOF

评论

2赞 Fiddling Bits 5/14/2020
这取决于您的系统上的内容。您可能正在按下哪个终止程序。EOFCtrl+C
0赞 Jabberwocky 5/14/2020
您的代码按预期工作。你期望什么输出?
0赞 Jabberwocky 5/14/2020
解释你到底按了什么键:....[h][e][l][l][o][Enter]
0赞 programmeurNED 5/14/2020
这是正确的。
0赞 pmg 5/14/2020
让最后的 printf 有点不同,即:printf("and finally %d\n", c);

答:

1赞 Miradil Zeynalli 5/14/2020 #1

不,它没有跳过任何东西。

注意:您正在打印整数(不是字符,如果这是您想要的)。因此,输入有 5 个字符:因此,输出为:c"hello"

0
1
2
3
4

然后,由于您按下时有换行符(有您的输出)。但是,除非您强制程序这样做(我的意思是,用 Ctrl +C 中断),否则 you loop 永远不会退出。如果你,再次测试你的代码,并输入数据,即使在 之后,你会看到,你仍然在循环中。'\n'enter5"hello"

评论

0赞 programmeurNED 5/14/2020
当我调试程序时,它在 for 循环后停止。不打印最后一条语句
0赞 Miradil Zeynalli 5/14/2020
您的运行和调试输出不同?
1赞 Jabberwocky 5/14/2020 #2

将您的程序更改为:

#include <stdio.h>

int main() {    
  int c;
  int ch;

  for (c = 0; (ch = getchar()) != EOF; ++c) {
    printf("%d %d\n", c, ch);
  }

  printf("%d %d\n", c, ch);    
  return 0;
}

现在你应该了解自己发生了什么。

评论

0赞 programmeurNED 5/14/2020
谢谢你@Jabberwocky。我不明白为什么最后一行 --> Printf(“End: %d\n, c”);不打印
0赞 Jabberwocky 5/14/2020
@programmeurNED你按什么键??你们的平台是什么?
1赞 RobertS supports Monica Cellio 5/14/2020 #3

"当我执行这个for循环函数并键入'hello'时,输出将是012345”。

你还有什么期待? 只需从 开始每次迭代都会递增。c0

"但是,它会跳到 for 循环之外的最后一个打印功能?"

不,它没有。事实上,它甚至没有脱离循环。按压机制作的换行符不会让你跳出循环;只有信号化的人才能做到这一点。forEnterEOF

因此,该程序甚至没有终止。它卡在循环中。

您需要在 Linux 或 Windows 上发出信号才能跳出循环。EOFCTRL + DCTRL + Z

评论

0赞 programmeurNED 5/14/2020
完全!它如何打破for循环?
0赞 RobertS supports Monica Cellio 5/14/2020
@programmeurNED 例如,使用 like 或 .EOFCTRL + DCTRL + Z
0赞 Jabberwocky 5/14/2020
@programmeurNED您需要输入 EOF(在 Linux/Mac 上为 Ctrl+D,在 Windows 上为 Ctrl+Z)
-1赞 c300g97 5/14/2020 #4

我明白你在尝试做什么,但首先我会声明“c”为字符,这样你就是在对字符进行隐式转换,这在 C 语言中是允许的,但应该避免。

我最好的猜测是你的编译器(我想 mingw 在 Windows 上)没有告诉你到底发生了什么,试试这个:

当你在 Linux 之外为 C 语言构建(编译)一些东西时,请执行以下操作:

“ gcc -o nameoftheexecutable file.c -Wall ” 并执行它 “ ./nameoftheexecutable

该 -Wall 将打印出控制台的所有警告,包括 EOF 警告。

通过这样做,并了解您正在编写的IDE或环境,我们可以为您提供帮助。

0赞 isrnick 5/14/2020 #5

当您键入并按 Enter 键时,while 循环不会结束,因为 still 不会等于 。因此,循环将继续使用 getchar() 等待读取新字符。hellogetchar()EOF

您需要在 Windows 的 cmd(phrasefix).exe 上按 Ctrl+Z,或在 Linux 的终端上按 Ctrl+D,以继续执行程序而不向输入写入任何字符,然后无法读取字符并返回,最后退出循环。一旦它脱离循环,将在结束程序之前进行最后一次调用。getcharEOFprintf

或者,您可以更改条件,使循环在读取新行字符时结束,而不是在无法读取字符时结束,这样循环将在按 Enter 键后结束:getchar\n

int main() {

    int c;


    for (c = 0; getchar() != '\n'; ++c) {
        printf("%d\n", c);
    }

    printf("%d\n", c);

    return 0;
}