6

我在 StackOverflow 上看到了很多关于此的问题,但阅读答案并没有让我明白这一点,可能是因为我是 C 编程的新手。这是代码:

#include <stdio.h>

char* squeeze(char s[], char c);

main()
{
  printf("%s", squeeze("hello", 'o'));
}

char* squeeze(char s[], char c)
{
  int i, j;

  for(i = j = 0; s[i] != '\0'; i++)
    if(s[i] != c)
      s[j++] = s[i];
    s[j] = '\0';

  return s;
}

它编译,当我运行它时出现分段错误。我已经阅读有关返回数组的常见问题解答,并尝试了那里建议的“静态”技术,但仍然无法使程序正常工作。谁能指出它到底有什么问题以及我将来应该注意什么?

4

3 回答 3

6

传递给挤压函数的第一个参数是一个read-only字符串文字"hello",您正在尝试修改它。

而是将其传递给可修改的 char 数组:

char str[] = "hello";
printf("%s", squeeze(str, 'o'));
于 2010-04-13T02:11:53.920 回答
3

问题是常量char 数组"hello"可能无法被传递给它的函数正确修改。因此,只需确保您传递了一个非常量数组(例如,通过传递一个本地数组,只要在squeeze调用者之外不需要结果):

int main()
{
  char xxx[] = "hello";
  printf("%s", squeeze(xxx, 'o'));

  return 0;
}

您希望这样的常量只能传递给一个const参数(以便编译器本身可以告诉您您做错了什么),但是,唉,这不是 C 标准所要求的(可能是出于向后兼容性的原因带有历史代码)。

于 2010-04-13T02:11:22.337 回答
3

这是试图修改不可修改的数据。

“hello”是一个常量字符串,存储在内存中的某个地方。那么,你想要做的是改变它,而这通常是不允许的。我不明白你所说的“静态”是什么意思,但你想要的是......

int main()
{
  char hello_str[16];
  strcpy(hello_str, "hello");
  printf("%s", squeeze(hello_str, 'o'));
}
于 2010-04-13T02:13:09.070 回答