2012-12-19 23 views
0

我在The C Answer Book中找到了這段代碼。這些函數之間有什麼不同?

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

我寫我的版本:

int readline(char line[], int lim) { 
    int c, i; 
    for(i=0; (c=getchar())!=EOF && c!='\n'; ++i) { 
     if(i<lim-2) { 
      line[i]=c; 
     } 
    } 
    if(c=='\n') { 
     line[i]=c; 
     ++i; 
    } 
    line[i]='\0'; 
    return i; 
} 

我只用一個變量「i」作爲計數器,但最初的版本已經用了兩個變量「i」和「j」作爲計數器。 兩者有什麼區別?

請告訴我他們有什麼不同?

回答

5

函數的第二個版本葉line未初始化的一部分和風險寫入該最終「\ n」,「\ 0」超越案件line緩衝其中初始循環繼續超越i<lim-2

3

如果結束用戶輸入超過lim-2字符,第一個版本可以正常工作,而第二寫入過去的line末:

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

這並不意味着你實際上需要兩個變量。你可以使用一個,但你必須在循環之後加蓋。做你認爲使代碼更容易閱讀的內容。

+0

如何'蓋'變量? – ShuklaSannidhya

+2

@ SandyLee_user53167:查看它是否大於最大值,如果是,則將其設置爲最大值。 – NPE

相關問題