我在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
”作为计数器。
这两者有什么区别?
请告诉我他们有什么不同?
答案 0 :(得分:5)
该函数的第二个版本使line
的一部分未初始化,并且在初始循环继续的情况下,有可能将最终的'\ n','\ 0'写入line
缓冲区的末尾超出i<lim-2
答案 1 :(得分:3)
如果用户输入的字符数超过lim-2
,则第一个版本正常工作,第二个版本写入line
的结尾:
if(c=='\n') {
line[i]=c; <<=== here
++i;
}
line[i]='\0'; <<=== and here
这并不意味着你实际上需要两个变量。您可以使用一个,但必须在循环后限制它。做任何你认为使代码更容易阅读的内容。