K& R第一版,练习1.18(for语句中的测试是笨拙的)

时间:2017-12-13 19:37:49

标签: c loops for-loop while-loop

我无法得出关于循环语句中的"测试的结论"在编程方面意味着。它是关于循环括号中的测试还是循环迭代的大括号中的测试?

练习1.18在这里:

char line[];
int max; 

main() 
{
    int len;
    extern int max;
    extern char save[];

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

getline() 
{
    int c,i;
    extern char line[];

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

copy()   
{                          
    int i;
    extern char save[];
    extern char line[];

    int i = 0;
    while( (save[i] = line[i] ) != '\0') 
        ++i;
}
  

练习l-18。上面的getline的for语句中的测试是相当的   笨拙。重写程序以使其更清晰,但保留相同   文件末尾或缓冲区溢出时的行为。这种行为最合理吗?

1 个答案:

答案 0 :(得分:1)

从注释开始,似乎应该重写for循环以使代码更具可读性。

我可以建议以下解决方案用for循环代替while循环。

getline() 
{
    int c, i;
    extern char line[];

    i = 0;

    while ( i <= MAXLINE -1 && ((c = getchar()) != EOF) && c != '\n' )
    { 
        line[i++] = c;
    }

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

    line[i] = '\0';

    return i;
}

重写函数后,我看到了一个错误。必须初始化变量c,并且必须更改while循环中的第一个子条件。

因此该函数可以查找例如

getline() 
{
    int c, i;
    extern char line[];

    i = 0;
    c = EOF;

    while ( i < MAXLINE - 1 && ((c = getchar()) != EOF) && c != '\n' )
    { 
        line[i++] = c;
    }

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

    line[i] = '\0';

    return i;
}

这是一个示范程序

#include <stdio.h>
#include <string.h>

#define MAXLINE 10

char line[MAXLINE];

int getline( void )
{
    int c, i;
    extern char line[];

    i = 0;
    c = EOF;

    while (i < MAXLINE - 1 && ((c = getchar()) != EOF) && c != '\n')
    {
        line[i++] = c;
    }

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

    line[i] = '\0';

    return i;
}

int main( void )
{
    int max = 0;
    int len;
    char save[MAXLINE];

    while ((len = getline()))
        if (len > max) {
            max = len;
            strcpy( save, line );
        }
    if (max > 0)  printf("%s", save);

    return 0;
}

它的输出(如果在Windows中作为控制台应用程序运行)可能看起来像

1
123456789
12345
123
1234567
^Z
123456789