我对C中的参数范围有疑问。我是C的新手,我一直在研究一个问题,其中一个TA在我之后给了我一个函数getline()挣扎
int main(void) {
printf("Type a string, then hit enter\n");
printf("You may type strings after an enter, but you must hit enter again to record the new string\n");
fflush( stdout );
int len;
char line[Limit];
while((len=getline(line,Limit))>0)
{
reverse(line);
printf("%s",line);
}
}
调用函数getline()定义为:
int getline(char s[], int lim){
int i,c;
for(i=0;i<lim-1 &&((c=getchar())!=EOF) && (c !='\n');++i)
s[i]=c;
if(c== '\n')//if c is a newline
{
s[i]=c;
++i;
}
s[i]= '\0';
return i;
}
由于char line[limit]
在while条件中传递到getline()
。 getline()
可以对line[]
起作用并更改其价值。
我的问题是,一旦完成循环的迭代,在while循环中再次调用getline()
时,它是否仍然保留第一次迭代的值或是否重置?< / p>
我知道退出while循环后line[]
为空,但我想知道它在循环中的细微差别。
例如,如果我输入stdin:
"Hello\n
"How are you\n"
当line[]="Hello\n\0"
完成while循环的第一次迭代时, getline()
。当getline()
再次调用迭代2时,是line[]="Hello\n\0"
? (假装反向不存在)并被覆盖或line[]="\0"
?
如果反向不存在(使一个字符串的长度与打印无关)并且我输入了
"How are you\n
Hello\n"
会line[]="Hello\n\0you\n\0"
吗?在while结束之前的第二次迭代之后?
答案 0 :(得分:0)
是的,在C中,数组是按引用传递意味着您的程序不是将整个数组传递给函数,而是将指针传递给存储数组的内存地址。这意味着当您在函数中修改它时,它也会在外部代码中修改它。当您在getline
中向s添加更多字符时,您还会在line
中向main()
添加字符。
答案 1 :(得分:0)
因为char行[limit]在while条件中被传递到getline()。 getline()在line []上工作并改变它的值。我的问题是,一旦完成循环的迭代,当在while循环中再次调用getline()时,它是否仍然保留第一次迭代的值或是否重置?
在循环外声明数组line
。它最里面的封闭块是作为整个函数体main()
的块;它的生命周期是从声明到结束。对于该生命周期的持续时间,声明的标识符line
始终指定相同的对象,并且该对象保留其值,除非该程序可以显式修改该值。特别是,如果使用初始化程序声明数组,那么当数组首次出现时,该初始化程序只应用一次。
因此,line
数组确实从循环的一次迭代到下一次迭代保留其值。但是,在循环的每次迭代中完成的第一件事就是测试循环条件,这需要调用getline()
,这会修改部分或全部数组的元素。因此,循环体中的语句将在每次迭代时看到新的数组内容。