gpt4 book ai didi

C - 用 if 语句重写 for 循环中的 while 循环

转载 作者:太空宇宙 更新时间:2023-11-04 05:18:04 26 4
gpt4 key购买 nike

--小心前面可怕的新手代码--

我正在尝试将这个简单的计数程序从 while 重写为 for

int c, nc;

nc = 0;
while ((c = getchar()) != EOF) {
if (c != '\n')
++nc;
}
}
printf("%d\n", nc);

这输出 example->8

到目前为止,我尝试了这几个例子:

int c, nc;
for (nc = 0; ((c = getchar()) != EOF && (c = getchar()) != '\n'); ++nc)
;
printf("%d", nc);

int nc;
for (nc = 0; getchar() != EOF; ++nc)
if (getchar() == '\n')
--nc;
printf("%d", nc);

这两种尝试都会导致奇怪的输出,如 example->3a->0,而且程序在收到后不再“等待”中断它的输入,它只显示输出并自行关闭。

我想知道这里发生了什么,因为正如我所见,我只是插入(非常笨拙..)一个 if 检查并且似乎无法解释发生了什么..

最佳答案

你正在调用 getchar() 两次

for (nc = 0; getchar() != EOF; ++nc)
if (getchar() == '\n')
--nc;
printf("%d", nc);

试试这个

int chr;
int nc;

chr = fgetc(stdin);
for (nc = 0 ; chr != EOF ; nc += (chr == '\n') ? 0 : 1)
chr = fgetc(stdin);
printf("%d\n", nc);

getchar() 等同于 fgetc(stdin) 从输入流 stdin 中读取一个字符,一旦您读取了该字符,您必须对其进行处理,因为它已从流中删除,因此两次调用该函数将从 stdin 中删除两个字符,因此您的计数将是错误的。

因此,如何编写 for 循环并不重要,重要的是每次迭代调用一次 getchar(),例如,这可以工作

int chr;
int nc;

for (nc = 0 ; ((chr = fgetc(stdin)) != EOF) ; nc += (chr == '\n') ? 0 : 1);
printf("%d\n", nc);

或者这个

int chr;
int nc;

for (nc = 0 ; ((chr = fgetc(stdin)) != EOF) ; )
{
if (chr != '\n')
nc += 1;
}
printf("%d\n", nc);

请注意 x = (condition) ? value : another_value 被称为 ternary operator , 并且等同于

if (condition)
x = value;
else
x = another_value;

关于C - 用 if 语句重写 for 循环中的 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28191655/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com