【发布时间】:2021-09-19 10:08:32
【问题描述】:
在本书的第一章中有一个读取一组文本行并打印最长的代码示例。
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line size */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/* print longest input line */
main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/* getline: read a line into s, return length */
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: copy ′from′ into ′to′; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != ′\0′)
++i;
}
在 main 函数的主体中,作者将(line,maxline) 声明为参数。但稍后在 getline 函数本身中,参数是 (char s[],int lim),它匹配数据类型(第一个是字符串 e 第二个是 int),但它们的名称不同。这是否意味着它只更改了字符串的名称以便读者更容易理解?存储在s 字符串中的数据转到line 字符串?
复制函数也是如此,编写者在 main 的主体中调用 (longest, line),它们都是在程序开始时分配内存的字符串,而在 void 函数本身中,参数将名称更改为 to[],from[]。这真的让我很困惑。他是在制作另一个数组并传输数据,还是只是用不同的名称引用这些数组以使代码更易于阅读?
我对编程/计算机科学非常陌生,如果我的问题很愚蠢或令人困惑,那么抱歉。
【问题讨论】:
-
前向声明中的名称实际上并没有做任何事情,除了作为一种关于参数是什么的本地文档。您可以在前向声明中完全省略参数名称,例如
int getline(char [], int);. -
原型中的参数只是占位符,只有类型很重要,但最好在原型中使用与实际函数定义中相同的名称;他们显然没有在这里这样做。