c - 《The C Programming Language》一书中不同名称的字符串
问题描述
在本书的第一章中,有一个读取一组文本行并打印最长的代码示例。
#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
字符串?复制函数也是如此,编写者(longest, line)
在 main 的主体中调用,它们都是在程序开始时分配了内存的字符串,而在 void 函数本身中,参数将名称更改为to[],from[]
. 这真的让我很困惑。他是在制作另一个数组并传输数据,还是只是用不同的名称引用这些数组以使代码更易于阅读?我对编程/计算机科学非常陌生,如果我的问题很愚蠢或令人困惑,那就抱歉了。
解决方案
在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
返回 时,数组main
会有变化。line
推荐阅读
- php - 通过 Wordpress rest api 下载的 Excel 文件已损坏
- prolog - Prolog 前身数学
- javascript - 使用 Await 读取异步对象集
- c++ - 实现循环数组队列
- python - 如何展平一个numpy结构化数组,其中每个元素本身就是一个numpy数组(dtype ='O')
- python - 如何优化具有 groupby 的相似度矩阵以提高速度?
- android - 我在启动活动功能中的问题在哪里
- xamarin - 可以为具有相同源代码的 Windows、MacOS 构建 xamarin 应用程序吗?
- c# - Google.Cloud.Dialogflow.V2 检测意图不起作用
- spring-boot - 是否有 JHipster Oracle 11g 实施的示例?