【发布时间】:2021-08-01 09:37:55
【问题描述】:
#include <stdio.h>
#define MAXLINE 100
int get_line(char line[], int maxline);
void copy(char to[], char from[]);
/*Prints longest input line*/
int main(){
int len; /*Current line length*/
int max; /*Maximum length so far*/
char line[MAXLINE]; /*Current input line*/
char longest[MAXLINE]; /*Longest line is saved here*/
max = 0;
while ((len = get_line(line, MAXLINE)) > 0){
if (len > max){
max = len;
copy (longest, line);
}
}
if (max > 0)
printf("%s", longest);
return 0;
}
/*get_line: read a line into s, return length*/
int get_line(char s[], int lim){
int c, i;
for (i = 0; (i < lim - 1) && (c = getchar()) != EOF && (c != '\n'); ++i)
s[i] = c;
if (c == '\n'){
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
/*copy: Copy 'from' into 'to'*/
void copy (char to[], char from[]){
int i;
i = 0;
while((to[i] = from[i]) != '\0')
++i;
}
此代码来自C 编程语言 的第 1.9 节,我试图了解它是如何工作的。我不明白变量的范围是如何工作的。在while循环中,函数get_line正在修改变量line,函数copy正在修改变量longest。
它们不应该只在函数的范围内吗?我不明白为什么函数能够在main中修改它们
【问题讨论】:
-
您将
from的范围与它指向的内存内容混合在一起。请记住:将数组传递给函数时,它会衰减为指向第一个元素的指针 -
FWIW,
for (i = 0; (i < lim - 1) && (c = getchar()) != EOF && (c != '\n'); ++i)是 horrible 代码。将这么多东西塞进一行中,除了混乱之外,没有任何收获。将赋值、减法和 三个 比较填充到三个for()循环表达式的中间,对于任何人脑来说,一次都无法解析。人脑在任何时候只能准确地跟踪 3 到 6 个状态/操作,而中间的表达式使用了其中的 5 个。这是您无法理解这段代码的作用的一个重要原因。