【问题标题】:Strings with diferent names in "The C Programming Language" book《The C Programming Language》一书中不同名称的字符串
【发布时间】: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);.
  • 原型中的参数只是占位符,只有类型很重要,但最好在原型中使用与实际函数定义中相同的名称;他们显然没有在这里这样做。

标签: c string function integer


【解决方案1】:

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 的新变量并将其初始化为传递给第二个参数的值。

在函数内部,可以使用slim,它们会有这些初始值。如果函数更改slim,这根本不会影响调用者(main 中的代码)。用作调用参数的任何内容都与参数无关。参数是传递值的副本。

但是,由于s 指向调用者拥有的内存,每当函数更改s 指向的任何内容时,都会更改调用者正在使用的内存。所以,当getline返回main时,line数组就会发生变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多