-3

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

有人可以帮我找出问题所在吗?

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

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

#include<stdio.h>

#define MINLEN 80
#define MAXLEN 1000

/* getlin : inputs the string and returns its length */
int getlin(char line[])
{
    int c,index;

    for(index = 0 ; (c != '\n') && ((c = getchar()) != EOF) && (index < MAXLEN) ; index++)
        line[index] = c;

    return (index);                                                                     // Returns length of the input string
}

main()
{
    int len;
    char chArr[MAXLEN];

    while((len = getlin(chArr))>0)
    {
        /* A printf here,(which I had originally inserted for debugging purposes) Miraculously solves the problem!!*/
        if(len>=MINLEN)
            printf("\n%s",chArr);
    }
    return 0;
}
4

4 回答 4

3

And I omitted the null('\0') character insertion as I find C generally automatically attaches it to the end of a string (Doesn't it?).

No, it doesn't. You're using getchar() to read input characters one at a time. If you put the chars in an array yourself, you'll have to terminate it yourself.

The C functions that return a string will generally terminate it, but that's not what you're doing here.

Your input loop is a little weird. The logical AND operator only executes the right-hand-side if the left-hand-side evaluates to false (it's called "short-circuiting"). Rearranging the order of the tests in the loop should help.

for(index = 0 ; (index < MAXLEN) && ((c = getchar()) != EOF) && (c != '\n'); index++)
    line[index] = c;

This way, c receives a value from getchar() before you perform tests on its contents.

于 2013-09-05T06:58:18.390 回答
1

1) C 不会\0在你的字符串中添加final。您负责使用至少 81 个字符的数组,并将最后\0一个字符放在您写入的最后一个字符之后。

2)你c在阅读之前测试它的价值

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

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

成为:

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

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

于 2013-09-05T07:01:19.887 回答
1

我对出了什么问题并不肯定,但是您没有向程序提供输入,所以我猜。

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

在测试之前,您永远不会 SET c 到 getlin 函数中的任何内容,这就是问题所在。

于 2013-09-05T07:01:39.977 回答
1

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

于 2013-09-05T07:01:50.657 回答