C语言函数和字符数组的问题

//问题及源码如下, 想了很久也没想明白,希望大家多多指教,万分感谢!
#include<stdio.h>

#include<stdlib.h>
#define MAXLINE 1000//允许输入行的最大长度
int getline(char line[],int maxline);
void copy(char to[],char from[]);
main()
{
int len;//当前行长度
int max;//目前为止发现的最长行长度
char line[MAXLINE];//当前输入行
char longest[MAXLINE];//用于保存最长的行
max = 0;
printf("\t\t\t\t统计最长行\n");
while((len = getline(line,MAXLINE)) > 0)//? 不明白这个是什么意思
if(len > max)
{
max = len;
copy(longest,line);//把longest和line这两个参数传递给copy函数,其中longest和line这两个数组名怎么传递啊。越想越想不明白
}
if(max > 0)
printf("%s",longest);
system("pause");
return 0;
}
//getline函数:读取字符串,获取其长度
int getline(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函数:新输入的字符串与之前保存的最长的字符串比较长度,保留最长的那个,最后输出次字符串
void copy(char to[],char from[])//这个函数的功能是保存最大的值,完全像不明白是怎么实现的。
{
int i;
i = 0;
while((to[i] = from[i]) != '\0')
++i;
}

1、先解释getline(),意思是读取一行字符串,“for(i = 0;i < lim-1&&((c = getchar())) != EOF&& c != '\n';++i)//”,语句终止条件是读取字符数不大于最大长度lim且能没到输入流尾且不是换行符,getchar()没读取到内容会返回EOF,即-1.getline()的返回值是i,即实际读取到的字符数
2、因此,“while((len = getline(line,MAXLINE)) > 0)”的意思就是当读取一行数据的长度不小于0时,执行while循环体内容。
3,“copy(longest,line)”,longnes,line均为数组名,数组名名其实保存的是数组第一个元素的地址,即为传地址调用,C语言函数参数有两种传递方式,另一种是传值调用。
4、copy()函数中,主要是“while((to[i] = from[i]) != '\0')”比较难理解点,因为'\0'为字符串结束标志,首先"!="优先级大于"=",所以判断条件是这样的while(to[i]=(from[i]!='\0')),c语言假为0,即循环终止条件为读到from结束,若from的长度小于to,没问题,若from长度大于to,有可能造成to数组越界。好吧,比较晚了,睡觉,有什么疑问可以继续追问追问

非常感谢您的帮助。还有些疑问想请教一下您:问题有点多
(1)for(i = 0;i < lim -1&&(c = getchar()) != EOF&&c != '\n';++i)//请问这段代码中的i < lim-1的意思是因为字符数组是以'\0'结束,所以要给'\0'保留一个位置,所以才要lim-1吗?

(2)getline函数中出现了两处 s[i] = c;// 能麻烦解释一下每个s[i] = c;的作用吗?s[i] = '\0';这个理解起来也朦朦胧胧的感觉。
(3)copy函数中 while循环后面的 ++i;的意思是?

追答

1、看下面“s[i] = c”,知道最后一个位置预留给使循环结束的字符,而循环结束只有三种可能,一是i=='lim-1',一是读到了'\n',另一个是读取到末尾了。
2、判断是确定读取以'\n'结束,如果是就把'\n'加入字符串尾部,字符串长度加1,否则就不添加。程序中的第一个s[i]=c是没有必要的
3、++i是为了往前比较呀,如果i不自加,不是死循环了嘛,呵呵

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-26
copy(longest,line);//把longest和line这两个参数传递给copy函数,其中longest和line这两个数组名怎么传递啊。越想越想不明白

C语言里数据名就是指向数组第一个元素的指针

void copy(char to[],char from[])//这个函数的功能是保存最大的值,完全像不明白是怎么实现的。

这个函数不是保存最大的值,而是将from整个复制到to,最大值是由于前面
if(len > max) 限制了只有长度大于目前长度的才被复制本回答被网友采纳
第2个回答  2012-09-26
while((len = getline(line,MAXLINE)) > 0) //如果输入的这一行长度大于0
copy(longest,line);//数组名表示数组的地址
for(i = 0;i < lim-1&&((c = getchar())) != EOF&& c != '\n';++i)//for中间那句要求不为文件末尾且不为回车符
while((to[i] = from[i]) != '\0')//把from中的每个字符复制到to,一直到from结束,'\0'是字符串结束标志
第3个回答  2012-09-26
s[i] = c;//这个的功能是?是给数组赋值的意思啊,你定义了一个数组肯定要给他赋值的啊
第4个回答  2012-09-26
从键盘获得按键数据
相似回答
大家正在搜