C函数中的封装-K&;R第1.9节

C函数中的封装-K&;R第1.9节,c,function,C,Function,我对C相当陌生,我正在学习Ritchie和Kernighan的C编程语言,我不理解以下代码是如何工作的: #include <stdio.h> #define MAXLINE 1000 int getline(char line[], int maxline); void copy(char to[], char from[]); int main() { int len; int max; char line[MAXLINE]; char lon

我对C相当陌生,我正在学习Ritchie和Kernighan的C编程语言,我不理解以下代码是如何工作的:

#include <stdio.h>
#define MAXLINE 1000

int getline(char line[], int maxline);
void copy(char to[], char from[]);

int main()
{
    int len;
    int max;
    char line[MAXLINE];
    char longest[MAXLINE];

    max = 0;
    while((len = getline(line, MAXLINE)) > 0)
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0)
        printf("%s", longest);
    return(0);
}

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;
    }
    s[i] = '\0';
    return(i);
}

void copy(char to[], char from[])
{
    int i;

    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}    
#包括
#定义MAXLINE 1000
int getline(字符行[],int maxline);
无效副本(字符到[],字符从[]);
int main()
{
内伦;
int max;
字符行[MAXLINE];
字符最长[MAXLINE];
max=0;
而((len=getline(line,MAXLINE))>0)
如果(长度>最大值){
max=len;
副本(最长,行);
}
如果(最大值>0)
printf(“%s”,最长);
返回(0);
}
int getline(字符s[],int lim)
{
int c,i;
for(i=0;i语句
while((to[i]=from[i])!='\0')
实际上是一个隐藏在比较中的赋值

这是一个我个人感到困惑的速记代码,你正在证明它实际上是。

语句
,而((to[I]=from[I])!='\0')
实际上是一个隐藏在比较中的赋值


这是一个我个人感到困惑的速记代码,您正在证明它实际上是。

复制功能通过指针的魔力工作。 本质上,指针基本上是一个内存地址,您可以像从同一程序访问数组一样访问它

顺便说一句,在我看来,这是一本更好的书。 他解释了C语言的许多概念,同时也指出了与您所问的相同的
copy
函数中的一些缺陷

更新

他实际上删除了关于K&R C的部分,因为他认为C已经死了。
我认为他错了,但是,对每个人来说,他都是错的。

复制功能通过指针的魔力工作。 本质上,指针基本上是一个内存地址,您可以像从同一程序访问数组一样访问它

顺便说一句,在我看来,这是一本更好的书。 他解释了C语言的许多概念,同时也指出了与您所问的相同的
copy
函数中的一些缺陷

更新

他实际上删除了关于K&R C的部分,因为他认为C已经死了。 我认为他错了,但对每个人来说都是错的。

void copy(char-to[],char-from[])
实际上与
void copy(char*to,char*from)
一样。因此,向copy函数传递两个指针。该函数可以更改指针的目标。这种机制称为“引用调用”。 (复制函数只需要更改to指针的目标,from指针的目标不需要更改。这可以通过
void copy(char*to,const char*from)
变得更清楚)

void copy(char to[],char from[])
实际上与
void copy(char*to,char*from)相同
。因此,将两个指针传递给复制函数。该函数可以更改指针的目标。这种机制称为“引用调用”。
(复制函数只需要更改到指针的目标,而不需要更改从指针的目标。这可以通过
void copy(char*to,const char*from)
来更清楚地了解)

它将
修改为
from
。内部
copy()
to
from
都是指针类型,因此您正在写入调用者可以访问的内存(因此调用者可以看到它的操作)。您错误地认为C与其他语言一样将字符串作为基本类型。它不是:在C中,当您传递“字符串”时对于一个函数,您真正传递的是它启动时的内存地址,允许该函数在该地址和后续地址(如果在可写内存中)写入所有内存。在
行中((to[i]=from[i])!='\0')
有一个赋值(
to[i]=from[i]
)有人将copy实现为
while(*to++=*from++);
(看,while块实际上是空的,所有问题都在测试表达式中解决。)它将
修改为
,并将
修改为from
to
from
都是指针类型,因此您正在写入调用者可以访问的内存(因此调用者可以看到它的操作)。您错误地认为C与其他语言一样将字符串作为基本类型。它不是:在C中,当您传递“字符串”时对于一个函数,您真正传递的是它启动时的内存地址,允许该函数在该地址和后续地址(如果在可写内存中)写入所有内存。在
行中((to[i]=from[i])!='\0')
有一个赋值(
to[i]=from[i]
)有人将copy实现为
while(*to++=*from++);
(看,while块实际上是空的,所有内容都在测试表达式中解决了。)是的,while循环很难理解。也许更容易理解:
do{to[i]=from[i];}while(to[i++]!='\0')
但是也有这个post增量,它与comparisonYes混合在一起,while循环很难理解。也许这更容易理解:
do{to[i]=from[i];}while(to[i++]!='\0')
但是还有一个post增量,它与comparisonThat copy函数混合使用,根本不使用任何指针。请不要将数组索引与指针解引用混淆。原始K&R代码没有做任何指针算术(它增加数组索引,而不是指针)也许读那本书而不是读K&R会让你在不区分指针和数组时遇到麻烦。@LuisColorado我知道区别,但数组是指向堆栈而不是堆的指针。我可以将变量定义为数组,并将其传递给请求指针的函数,这样就可以了。事实上,我不喜欢定义参数s作为数组,即使这是我要传递的。对不起,数组不是