C初学者for循环输出问题

C beginner for-loop output issue

我是C新手(自学)。 当我在键入 'hello' 时执行此 for 循环函数时,输出将为 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,它是整数(不是字符,如果这是您想要的)。所以,输入 "hello" 有 5 个字符: 所以,输出是:

0
1
2
3
4

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

将您的程序更改为:

#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;
}

现在你应该明白发生了什么。

"When I execute this for-loop function and I type 'hello' the output will be 012345".

您还有什么期望? c 每次迭代都会递增,从 0.

开始

"However it skips to the last print function outside of the for-loop?"

不,不是。事实上,它甚至不在 for 循环之外。新闻界对 Enter 的换行不会让你跳出循环;只有信号化的 EOF 正在这样做。

所以,程序甚至没有终止。它卡在循环中。

您需要在 Linux 上用 CTRL + D 或 Windows 上的 CTRL + Z 发出信号 EOF 以跳出循环。

我明白你想做什么,但首先我会声明 "c" 为 char ,这样你就可以隐式转换为 char,这在 C 语言中是允许的, 但应该避免。

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

当您为 C 语言构建(编译)linux 之外的内容时,请执行以下操作:

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

那个 -Wall 将向控制台打印出所有警告,包括 EOF 警告。

通过这样做,并了解您编程的 IDE 或环境,我们可以帮助您。

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

您需要在Windows' cmd.exe 上按 Ctrl+Z 或在 Linux 的终端上按 Ctrl+D 以继续执行程序而无需编写任何内容字符输入,然后getchar将无法读取一个字符和return EOF,最后退出循环。一旦退出循环,最终的 printf 调用将在程序结束前进行。

或者你可以改变条件,让循环在 getchar 读取一个新行字符 \n 时结束,而不是在读取一个字符失败时结束,这样循环将在之后结束您按 Enter:

int main() {

    int c;


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

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

    return 0;
}