C:找到最长的线
Posted
技术标签:
【中文标题】C:找到最长的线【英文标题】:C: find the longest line 【发布时间】:2020-06-02 07:27:17 【问题描述】:这是 Dennis Ritchie 和 Brian Kernighan 合着的 The C Programming Language 一书(第二版)中的一个示例程序。我的问题是,如果我们传递的是值(变量行)而不是函数长度的引用,那么变化如何反映在主函数中?
#include <stdio.h>
#define MAXLINE 1000
int length(char s[], int lim);
void copy(char to[], char from[]);
int main()
int len;
int max;
char line[MAXLINE];
char longest[MAXLINE];
max = 0;
while ((len = length(line, MAXLINE)) > 0)
if (len > max)
max = len;
copy(longest, line);
if (max > 0)
printf("%s", longest);
return 0;
int length(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;
void copy(char to[], char from [])
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
【问题讨论】:
你能改写你的问题吗? 我想我知道你的意思。我们将line
传递给length
,然后length
对其进行修改。然后在main
中,我们看到对line
所做的更改。这就是让你困惑的地方吗?
@user366312,在main的while循环中,我们只得到了行的长度。此外,我们将变量 line 的值传递给函数 length。但是函数长度只获取行(来自标准输入)并返回行的长度。那么,我的问题是main函数怎么还能访问length函数的局部变量(s[])?
@bereal 是的,你明白了。
由于字符串是通过指针传递的,所以main函数中的line和length函数中的s是一样的,只是地址不同而已。因此,您可以使用 line 在 main 中访问字符串(在长度()中,名称为 s)
【参考方案1】:
这个定义:
int length(char s[], int lim)
可以改写为:
int length(char *s, int lim)
这可能更容易理解。我们不是按值传递变量,而是传递指针,因此函数可以访问数据并在必要时对其进行修改。
【讨论】:
哦,我不知道字符数组在C中不是按值传递的。谢谢你的回答。 @EpycZen 哦,别担心,C/C++ 中有很多东西你我都不知道 =)【参考方案2】:len = length(line, MAXLINE)
在 C 中,所有数组都是通过指针传递的。所以函数length
接收指向第一个字符的指针哦数组line
并修改这个数组
【讨论】:
感谢您的回答。我是 C 新手。以上是关于C:找到最长的线的主要内容,如果未能解决你的问题,请参考以下文章
Java 求解最长公共子序列&不相交的线&判断子序列&两个字符串的删除操作