关于C

时间:2017-03-23 16:15:34

标签: c function parameters while-loop scope

我对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结束之前的第二次迭代之后?

2 个答案:

答案 0 :(得分:0)

是的,在C中,数组是按引用传递意味着您的程序不是将整个数组传递给函数,而是将指针传递给存储数组的内存地址。这意味着当您在函数中修改它时,它也会在外部代码中修改它。当您在getline中向s添加更多字符时,您还会在line中向main()添加字符。

答案 1 :(得分:0)

  

因为char行[limit]在while条件中被传递到getline()。 getline()在line []上工作并改变它的值。我的问题是,一旦完成循环的迭代,当在while循环中再次调用getline()时,它是否仍然保留第一次迭代的值或是否重置?

在循环外声明数组line。它最里面的封闭块是作为整个函数体main()的块;它的生命周期是从声明到结束。对于该生命周期的持续时间,声明的标识符line始终指定相同的对象,并且该对象保留其值,除非该程序可以显式修改该值。特别是,如果使用初始化程序声明数组,那么当数组首次出现时,该初始化程序只应用一次。

因此,line数组确实从循环的一次迭代到下一次迭代保留其值。但是,在循环的每次迭代中完成的第一件事就是测试循环条件,这需要调用getline(),这会修改部分或全部数组的元素。因此,循环体中的语句将在每次迭代时看到新的数组内容。