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:找到最长的线的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题 最长递增子序列

如何找到最长的字母子串c ++

Java 求解最长公共子序列&不相交的线&判断子序列&两个字符串的删除操作

c_cpp 在一个句子中找到最长的单词

[Mdp] lc1035. 不相交的线(LCS+LIS+重点知识理解)

[Mdp] lc1035. 不相交的线(LCS+LIS+重点知识理解)