"The C Programming Language" 本书中具有不同名称的字符串
Strings with diferent names in "The C Programming Language" book
在本书的第一章中有这样一个代码示例,它读取一组文本行并打印最长的。
#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] = ′[=11=]′;
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]) != ′[=11=]′)
++i;
}
在main函数的主体中,作者将(line,maxline)
声明为参数。但稍后在 getline 函数本身中,参数是 (char s[],int lim)
,它匹配数据类型(第一个是字符串,第二个是 int),但它们没有相同的名称。这是否意味着它只更改 reader 的字符串名称以便更容易理解?存储在 s
字符串中的数据转到 line
字符串?
复制函数也是如此,编写者在 main 的主体中调用了 (longest, line)
,它们都是在程序开头分配了内存的字符串,而在 void 函数本身中,参数将名称更改为 to[],from[]
。我真的很困惑。他是在制作另一个数组并传输数据,还是只是用不同的名称引用这些数组以使代码更易于阅读?
我对 programming/computer 科学很陌生,如果我的问题很愚蠢或令人困惑,我很抱歉。
在int getline(char line[], int maxline);
中,参数名称只是占位符。它们没有效果。如果它们存在,通常好的编程习惯是使用与函数后面定义中相同的名称。
在 main
例程中,它有 getline(line, MAXLINE)
,这是一个函数调用。它表示将 line
的值和 MAXLINE
的值作为参数传递给函数。这有点复杂,因为 line
是一个数组,我们不能在 C 中使用数组的值。相反,编译器会自动将数组替换为指向其第一个元素的指针。所以这个指针被传递给getline
.
getline
的定义以int getline(char s[], int lim)
开头。这表示:
- 每当调用
getline
时,创建一个名为 s
的新变量并将其初始化为为第一个参数传递的值。
- 数组的复杂性在这里也有影响。虽然参数
s
声明为数组,但编译器自动将其调整为指针,就好像它表示 char *s
.
- 同时创建一个名为
lim
的新变量并将其初始化为为第二个参数传递的值。
函数内部可以使用s
和lim
,它们都会有这些初始值。如果函数改变 s
或 lim
,这根本不会影响调用者(main
中的代码)。用作调用参数的任何内容都与参数无关。参数是传递值的副本。
但是,由于 s
指向调用者拥有的内存,因此每当函数更改 s
指向的任何内容时,都会更改调用者正在使用的内存。所以,当getline
returns到main
时,line
数组会有变化
在本书的第一章中有这样一个代码示例,它读取一组文本行并打印最长的。
#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] = ′[=11=]′;
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]) != ′[=11=]′)
++i;
}
在main函数的主体中,作者将(line,maxline)
声明为参数。但稍后在 getline 函数本身中,参数是 (char s[],int lim)
,它匹配数据类型(第一个是字符串,第二个是 int),但它们没有相同的名称。这是否意味着它只更改 reader 的字符串名称以便更容易理解?存储在 s
字符串中的数据转到 line
字符串?
复制函数也是如此,编写者在 main 的主体中调用了 (longest, line)
,它们都是在程序开头分配了内存的字符串,而在 void 函数本身中,参数将名称更改为 to[],from[]
。我真的很困惑。他是在制作另一个数组并传输数据,还是只是用不同的名称引用这些数组以使代码更易于阅读?
我对 programming/computer 科学很陌生,如果我的问题很愚蠢或令人困惑,我很抱歉。
在int getline(char line[], int maxline);
中,参数名称只是占位符。它们没有效果。如果它们存在,通常好的编程习惯是使用与函数后面定义中相同的名称。
在 main
例程中,它有 getline(line, MAXLINE)
,这是一个函数调用。它表示将 line
的值和 MAXLINE
的值作为参数传递给函数。这有点复杂,因为 line
是一个数组,我们不能在 C 中使用数组的值。相反,编译器会自动将数组替换为指向其第一个元素的指针。所以这个指针被传递给getline
.
getline
的定义以int getline(char s[], int lim)
开头。这表示:
- 每当调用
getline
时,创建一个名为s
的新变量并将其初始化为为第一个参数传递的值。 - 数组的复杂性在这里也有影响。虽然参数
s
声明为数组,但编译器自动将其调整为指针,就好像它表示char *s
. - 同时创建一个名为
lim
的新变量并将其初始化为为第二个参数传递的值。
函数内部可以使用s
和lim
,它们都会有这些初始值。如果函数改变 s
或 lim
,这根本不会影响调用者(main
中的代码)。用作调用参数的任何内容都与参数无关。参数是传递值的副本。
但是,由于 s
指向调用者拥有的内存,因此每当函数更改 s
指向的任何内容时,都会更改调用者正在使用的内存。所以,当getline
returns到main
时,line
数组会有变化