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;
}
我是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 be012345
".
您还有什么期望? 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;
}