【问题标题】:Return type void. Also need assistance with my function返回类型无效。我的功能也需要帮助
【发布时间】:2015-03-24 21:11:54
【问题描述】:

我正在尝试编写一个函数,该函数允许我在字符串“src”中定位子字符串“from”,并在所有情况下将“from”子字符串替换为“to”子字符串,并输出新字符串通过“目的地”

void find_replace(char* src, char* from, char* to, char* dest)
{
  dest = (char * ) malloc(sizeof(src)+sizeof(from));
  char * stringcomb;
  int i;
  int j;
  stringcomb = strstr(src, from);
  strncpy(stringcomb, to, strlen(to));
  puts (src);
  return ;
}
int main (int argc, char *argv[])
{
   char* dest;

}

【问题讨论】:

  • sizeof(src) + sizeof(form) 是错误的,假设在src 字符串中有n 出现to 并且sizeof() 没有给你字符串的长度,你仍然缺少终止'\0' 的空间,太多的问题......几分钟前你刚刚问了几乎相同的问题。
  • 知道了,所以我把它换成了strlen(src)+strlen(from)。这会有很大的不同吗?
  • 您的代码无法编译。缺少}。此外,dest 未使用。
  • 希望你能帮助我,但我在想(我没有这样做,因为我不太确定......)我可以做 dest = strstr(src, from) ; stringcpy(dest, to, strlen(to));放 (src) ;

标签: c arrays string pointers void


【解决方案1】:

那段代码有多个问题:

  • 当您对指针执行sizeof 时,您会得到指针的大小,而不是指针所指向的大小/长度。如果要获取字符串的长度,请使用strlen
  • 您忘记为终止 '\0' 字符分配空间。
  • 如果tofrom 长怎么办?那你就分配错了。
  • C 中的参数按值传递,这意味着它们被复制并且函数只有副本而不是原始的。这会影响您的 dest 论点。要模拟通过引用传递,您必须传递一个指针,在您的情况下是指向指针的指针。

最后:

只是为了挑剔:

  • 您不需要在返回void 的函数末尾显式声明return,编译器会隐式处理它。

【讨论】:

  • 抱歉,我忘了提供我们可以假设“to”不长于“from”。将 sizeof 更改为 lengthof,并占 '\0'。你能详细说明你的第四点吗?谢谢!
  • 您能否详细说明“C 中的参数”这一点?谢谢!
  • @LeehoLim 如果函数中的参数dest 是一个副本,并且您更改了它,那么您只更改副本而不更改原始。如果您稍微搜索一下,那么这里和其他地方关于通过引用传递指针的问题有 数千个
猜你喜欢
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多