2013-11-29 44 views
0

我以下的书“C程序设计语言”的运动之一: http://users.powernet.co.uk/eton/kandr2/krx116.html奇怪算法用C

在下面的程序中,如果输入文件包含行“^ h \ N”,例如getline函数将i和j初始化为0.由于'h'不是EOF或'\ n',因此j为0,因此执行循环中的块,将c分配给s数组指针的0索引。 j增加到1.然后块结束,i计数器递增到1.循环检查下一个字符是否是'\ n',并且是,所以块退出。此时,i和j都等于1.由于c等于'\ n',所以c被插入到s指针的索引1中,因为j是1.然后j递增到2.然后i递增到2.然后,空终止符'\ 0'插入到s指针的索引2中,因为j是2.然后函数返回2,因为i也是2.

我看不到j变量。因为当它增加时,我也是如此。有人说我错了:

“因为它们以不同的速率递增,i计数器用于跟踪字符串的长度,j变量在处理结束时将点空终止符需要进入字符串。“

但我说因为我和j是相同的值(一个只是增加了另一个),你可以使用我到空终止符需要去的地方,因为我也会等于2在我的上面的例子。

#include <stdio.h> 

#define MAXLINE 1000 /* maximum input line size */ 

int getline(char line[], int maxline); 
void copy(char to[], char from[]); 

/* print longest input line */ 
int main(void) 
{ 
    int len;    /* current line length */ 
    int max;    /* maximum length seen so far */ 
    char line[MAXLINE]; /* current input line */ 
    char longest[MAXLINE]; /* longest line saved here */ 

    max = 0; 

    while((len = getline(line, MAXLINE)) > 0) 
    { 
    printf("%d: %s", len, line); 

    if(len > max) 
    { 
     max = len; 
     copy(longest, line); 
    } 
    } 
    if(max > 0) 
    { 
    printf("Longest is %d characters:\n%s", max, longest); 
    } 
    printf("\n"); 
    return 0; 
} 

/* getline: read a line into s, return length */ 
int getline(char s[], int lim) 
{ 
    int c, i, j; 

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

/* copy: copy 'from' into 'to'; assume 'to' is big enough */ 
void copy(char to[], char from[]) 
{ 
    int i; 

    i = 0; 
    while((to[i] = from[i]) != '\0') 
    { 
    ++i; 
    } 
} 

我是对还是错?

+0

想想当你尝试阅读一条很长的路线时会发生什么。你只是使用错误的测试用例来充分理解它。 –

+0

是的,我没有编译器,但它看起来像'i == j'到一定程度,但它们确实有分歧。如果行的长度与MAXLINE相同, –

+0

会不会导致缓冲区溢出,导致行[s] ='\ 0' –

回答

3

你不太对。如果输入字符串长于极限,循环将继续增加i,以便对输入字符进行计数,即使它们没有进入结果字符串。

+0

我忘了考虑用例lol – JohnMerlino

+0

这是一个很好的例子,说明为什么好的变量名称很重要。如果'i'代替'nRead',而'j'代替'nStored',那就很明显了。 – Gene