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' 作为计数器。两者有什么区别?

请告诉我它们有什么不同?

4

2 回答 2

5

该函数的第二个版本留下未初始化的部分,并且在初始循环继续超出缓冲区的情况下,有line可能将最终的 '\n'、'\0'写入缓冲区的末尾linei<lim-2

于 2012-12-19T11:26:25.143 回答
3

如果用户输入了多个lim-2字符,则第一个版本可以正常工作,第二个版本会写到末尾line

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

这并不意味着您实际上需要两个变量。您可以使用一个,但您必须在循环后将其封顶。做任何你认为使代码更容易阅读的事情。

于 2012-12-19T11:27:12.867 回答