the c programming language书里的一个例子,运行有问题

#include <stdio.h>
#define MAXLINE 1000 
int gline(char line[], int maxline);
void copy(char to[], char from[]);

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

    max = 0;
    while( (len = gline(line, MAXLINE) ) >0)
        if(len > max) {
            max = len;
            copy(longest, line);
        }
    if(max > 0)
        printf("%s", longest);
    return 0;        
}

int gline(char s[], int lim)
{
    int c, i;

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

void copy(char to[], char from[])
{
    int i;
    i = 0;
    while( (to[i] = from[i]) != '\0')
        ++i;
}

书的1.9章 字符数组中的这段代码没有任何输出,帮忙看看哪里错了

阅读 2.1k
1 个回答

我修改下格式,否则又要被踩了。。。
之所以没有输出的因为唯一的输出语句printf("%s", longest);并没有被运行。为什么没有被运行呢?因为如果不输入EOF这个循环永远不会跳出:

while( (len = gline(line, MAXLINE) ) >0)
    if(len > max) {
        max = len;
        copy(longest, line);
    }

我们来看看gline()这个函数:

int gline(char s[], int lim)
{
    int c, i;

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

因为lim是等于MAXLINE的,
for (i=0; i < lim-1 && (c=getchar() )!=EOF && c!='n';++i)中只要循环进行了一次,i>=1了。
如果输入EOF\n字符,i不会加1,但输入\n会在下一行加1:

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

所以除了输入EOF外,while( (len = gline(line, MAXLINE) ) >0)这个循环会一直运行,并且这个循环是不会运行printf("%s", longest);的,所以没有输出。

总结下,只有输入EOF后,才会运行printf("%s", longest);并输出最长的字符串。我查了下,按"ctrl+d"就是EOF,当你输入了很多行字符串后,按下ctrl+d来显示最长的字符串。
比如我输入:

1
12
123
1234
12345
1234
123
12
1
`ctrl+d`

会输出12345

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进