2012-12-19 22 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

相关问题