2013-11-29 46 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