Easy C最长线复制程序

时间:2009-09-24 05:17:27

标签: c

这是Kernighan C书中的一个练习的变体。基本上打印标准输入的最长行。

我的问题是,如果查看'复制方法',如果复制方法返回void,复制方法是如何实际工作的。我来自Java并且是第一次学习C语言。 在copy方法中,to和from char数组是本地的。如果它们不会返回main,它们如何实际存储在main方法中的最长和行变量中?

我很困惑......

非常感谢您的时间!

编辑:感谢您的回复。

再说一遍......

喔。所以你作者用指针传递值。这是非常令人困惑的,因为它之前的页面读取 - “...在C中,被调用的函数不能直接改变调用函数中的变量;它只能改变其私有的临时副本。”这是对的吗?

第二个问题是,如何使这些函数像Java,PHP等一样传递数据。或者这是C程序员看到的一个好处吗?

来自K& R的代码

#include <stdio.h>
#define MAXLINE 1000

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

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 line[], int limit) {

 int i, c;

 for (i = 0;  i < limit - 1 && (c = getchar()) != EOF && c != '\n';  i++) line[i] = c;

 if (c == '\n') {

  line[i] = c;
  i++;

 }

 line[i] = '\0';

 return i;
}

void copy(char to[], char from[]) {

  int i;

  i = 0;
  while((to[i] = from[i]) != '\0')
    i++;
}

4 个答案:

答案 0 :(得分:3)

在C中,所有内容都按值传递。但是,您必须注意通过值传递的

char from[]这样的C风格数组不是容器对象,就像您可能期望的其他语言一样。对于大多数实际目的,C数组相当于指向第一个元素的指针,即char * from

因此,参数tofrom确实通过值传递,但它们是指针到数据,因此您可以修改指向的数据它们。

答案 1 :(得分:1)

尽管Java字符串是不可变的,但在C中,“字符串”只是字符数组。通过更改数组中的字符,更改在copy()外部是“可见的”。

答案 2 :(得分:0)

首先,这是你正在学习的可怕代码。它难以阅读,难以理解,并且不能处理超过给定限制的行。 ICK。

但是为了回答你的问题,当调用copy()时,这两个参数是指向存储字符数组的内存区域的指针。因此,当调用copy时,变量“to”等于调用帧中的“最长”,而“from”等于调用帧中的“line”。

答案 3 :(得分:0)

在问题的更新中,您会问:

  

“...在C语言中,被调用的函数不能直接改变调用函数中的变量;它只能改变其私有的临时副本。”这是对的吗?

是的,这是正确的,即使对于数组也是如此。然而,推理是微妙的。

对于整数参数:

int somefunc(int i) { return ++i; }

函数中对i的更改只会影响i的副本,而不会影响调用函数中与i对应的值:

int i0 = 26;
int i1 = somefunc(i0);

同样,对于'array'参数:

int anotherfunc(int a[]) { return *++a; }

并致电:

int array[3] = { 13, 23, 37 }; 
int n = anotherfunc(array);

函数接收指针array(又名&array[0])的副本,函数对函数a所做的更改对array没有任何影响在调用代码中。但是,如果函数是:

int modifyfunc(int a[]) { return *(++a) = 37; }

使用呼叫序列:

int array[3] = { 13, 23, 37 };
int n = modifyfunc(array);
int *ip = &array[1];
int m = modifyfunc(ip);

然后该函数不会修改调用函数中array - 指针 - 的值,但它会修改数组指向的数据(确切地说,它将array[1]设置为第一次调用时为37,第二次调用时为array[2]到37),以及修改array的副本(在函数内部称为a)。

因此,如上所述,C只有值传递,但是当传递的值是一个指针时,被调用的代码可能会修改指针指向的内容 - 但不能修改调用代码中的实际指针。 / p>

是的,所示功能中的副作用总是不必要的。他们说明了这一点,而不是现实的代码。