gpt4 book ai didi

c - C 程序的奇怪输出随重定向而改变

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:10 25 4
gpt4 key购买 nike

我编写了一个程序来解决 K&R 的练习 2-2。

#include<stdio.h>

#define MAXLINE 1000

/* write an equivalent loop without using && or || */
int Getline(char s[], int lim);

int main()
{
int len;
char line[MAXLINE];

while ((len = Getline(line, MAXLINE)) > 0) {
printf("%s%15s%d\n", line, "length: ", len);
}

return 0;
}

int Getline(char s[], int lim)
{
int flag = 1;
int i = 0, c = 0;

for (i = 0; flag == 1; ++i) {
if (i < lim - 1) {
if ((c = getchar()) != '\n') {
if (c != EOF) {
;
}
else {
flag = 0;
}
}
else {
flag = 0;
}
}
else {
flag = 0;
}
if (flag == 1) {
s[i] = c;
}
}

if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}

这个程序是错误的……以一种奇怪的方式。我使用重定向运行此代码,例如

./2-2 <in

使用 文件

Get this line.

然后输出到屏幕就是无数

G length: 1

看起来程序陷入了循环。但是当我停止使用重定向并在终端输入 Get this line. 时,尽管它仍然是错误的,但无数的输出消失了。为什么?

最佳答案

问题出在这里:

for (i = 0; flag == 1; ++i) {
^^^
i will always increment to at least 1
before the for-loop ends
so your function will never return 0

不是在 for 循环中递增,而是仅在插入新元素后递增。喜欢

    if (flag == 1) {
s[i] = c;
++i;
}

您可以使用 while 循环代替 for 循环,例如:

int i = 0;
while (flag == 1)
{
...
}

下一步是摆脱标志并使用 break 代替。喜欢:

int i = 0;
while (1)
{
if (i >= lim - 1) break;

...
}

您的代码会更短且更易于阅读。

关于c - C 程序的奇怪输出随重定向而改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50664595/

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