使用getchar()获取行时的无限循环

使用getchar()获取行时的无限循环,c,kernighan-and-ritchie,C,Kernighan And Ritchie,我在尝试K&R(ex 1-17)的一个练习,我想出了自己的解决方案。 问题是我的程序似乎挂起了,可能是在一个无限循环中。我省略了NUL('\0')字符插入,因为我发现C通常会自动将其附加到字符串的末尾(不是吗?) 有人能帮我找出毛病吗 如果有帮助的话,我正在win8(x64)上使用带有Cygwin的GCC编译器 问题-打印长度超过80个字符的所有输入行 #包括 #定义MINLEN 80 #定义MAXLEN 1000 /*getlin:输入字符串并返回其长度*/ int getlin(字符行[])

我在尝试K&R(ex 1-17)的一个练习,我想出了自己的解决方案。 问题是我的程序似乎挂起了,可能是在一个无限循环中。我省略了NUL('\0')字符插入,因为我发现C通常会自动将其附加到字符串的末尾(不是吗?)

有人能帮我找出毛病吗

如果有帮助的话,我正在win8(x64)上使用带有Cygwin的GCC编译器

问题-打印长度超过80个字符的所有输入行

#包括
#定义MINLEN 80
#定义MAXLEN 1000
/*getlin:输入字符串并返回其长度*/
int getlin(字符行[])
{
int c,索引;
对于(index=0;(c!='\n')&&((c=getchar())!=EOF)&&(index0)
{
/*这里的printf(我最初是为了调试而插入的)奇迹般地解决了这个问题*/
如果(len>=MINLEN)
printf(“\n%s”,字符);
}
返回0;
}
我省略了空('\0')字符插入,因为我发现C通常会自动将其附加到字符串的末尾(不是吗?)

不,没有。您正在使用
getchar()
一次读取一个输入字符。如果您自己将字符放入数组中,则必须自己终止它

返回字符串的C函数通常会终止它,但这不是您在这里要做的

你的输入循环有点奇怪。逻辑AND运算符仅在左侧计算为false时执行右侧(称为“短路”)。重新安排循环中测试的顺序应该会有所帮助

for(index = 0 ; (index < MAXLEN) && ((c = getchar()) != EOF) && (c != '\n'); index++)
    line[index] = c;
for(index=0;(index
这样,
c
在您对其内容执行测试之前从
getchar()
接收一个值。

1)c不会向字符串添加最终的
\0
。您负责使用至少81个字符的数组,并将最后一个
\0
放在最后一个字符之后

2) 在读取之前,您正在测试
c
的值

3) 您的程序不打印任何内容,因为printf使用I/O缓冲区,当您发送
\n
时,缓冲区会被刷新。修改此语句以打印最终的
\n

printf("\n%s",chArr);
成为:

printf("%s\n",chArr);

4) 要向您的程序发送EOF,您应该在unix下执行
Ctrl+D
,我不知道windows是否可以。这可能就是程序永远不会结束的原因。

我不确定出了什么问题,但你没有向程序提供输入,所以我猜

我的猜测是,在getlin中,变量c被设置为'\n',在这一点上,它永远不会得到另一个字符。它只是不断地返回和循环


问题在于,在测试getlin函数之前,从未将c设置为其内部的任何值。

c不会自动在字符串末尾插入NUL终止符。某些函数可能会这样做(例如snprintf)。查阅您的文档。此外,请注意初始化所有变量,如
getlin()

中的
c
“因为我发现c通常会自动将其附加到字符串的末尾”您在哪里找到的?关于代码中的问题:在
getlin
中,第一次测试
c!='\n'
,其中
c
未初始化,将具有不可预测的值,该值可能正好是
'\n'
。在声明时初始化它(声明变量时总是这样做是个好主意,以避免像这样的错误)。非常感谢您,好心的先生--这完全解决了问题..非常感谢您的回答。。但是,如果数组末尾没有\0,程序运行正常。。当我输入一个少于80个字符的句子时,程序将挂起。。即使在字符串末尾添加null也没有帮助。。有什么想法吗,先生?@Somu我编辑过,对循环条件提出了建议。再次感谢。。它起作用了。。谢谢。。好像我做错了很多事不客气。如果这解决了问题,您可以单击复选标记接受答案。:)
printf("%s\n",chArr);