返回类型void函数

时间:2015-01-26 12:17:52

标签: c arrays string pointers void

我正在尝试编写一个函数,允许我在字符串“src”中找到子元素“from”,并在所有情况下用“to”子字符串替换“from”子字符串,并输出新字符串通过“dest”;但是我认为我的代码看起来有点不确定,而且我不理解(概念上)如何返回带有dest的输出,因为输出的类型为void。我想知道是否有人可以提供一些帮助?

例如:

find_replace("pooppoop poop", "poo", "hel", dest) should return

"helphelp help"
谢谢你!

void find_replace(char* src, char* from, char* to, char* dest)
{
  dest = (char * ) malloc(sizeof(src)+sizeof(from));
  int i;
  int j;
  int check = 1;
  for (i = 0; i <= strlen(src) - 1; i++) {
    if (src[i] == from[0]) {
      for (j = 0; j <= strlen(from) - 1; i++) {
        if (src[i+j] != from[j]) {
          check = 0;}
        else {
          continue;
        }}}
    if (check == 1) {
      char * str3 = (char *) malloc(1 + strlen(&src[i]) + strlen(to));
      strcpy(str3, &src[i]);
      strcat(str3, to);
    }
    else { continue; }
  }
  return ;

6 个答案:

答案 0 :(得分:1)

在示例中为新字符串分配内存,但调用代码无法访问此变量。

基本上,传递字符串有三种方法。每个都有优点和缺点。

  • 传递固定大小的缓冲区

    int repl1(char *dest, int n, const char *src, const char *find, const char *repl)
    

    这里,调用函数提供了一个函数可以写入的缓冲区。提供最大缓冲区长度是个好主意,这样函数就不会溢出缓冲区。参数,其中您不打算更改的内容应为const,即指向不可修改数据的指针。

    这样的函数可以是void,但它也可以返回一个整数,表示dest中字符串的长度。

    优点是您可以轻松传递自动缓冲区。缺点是这些缓冲区可能太小而无法完成任务。

    像这样调用函数:

    char buf[80];
    int n = repl1(buf, sizeof(buf), str, "this", "that");
    
  • 返回已分配的内存

    char *repl2(const char *src, const char *find, const char *repl)
    

    这里,函数应该分配新的内存来保存缓冲区。该函数返回指向新内存的指针。该内存“属于”调用函数,后者负责释放内存。

    优点是该函数可以为任务分配足够的内存。缺点是调用函数必须负责管理新内存。

    像这样调用函数:

    char *dest = repl2(str, "this", "that");
    
    // Do stuff whith 'dest' ...
    free(dest);
    
  • 将指针指向精简版

    int repl3(char **dest, const char *src, const char *find, const char *repl)
    

    这是返回指针的变体,指针通过引用传递,因此可以更改。该函数还可以访问dest char缓冲区的旧内容。这对你的情况没用。我只提到了这种完整性的可能性。

    像这样调用函数:

    char *buf;
    int n = repl3(&buf, str, "this", "that");
    

这个答案解决了传递数据的方式。您的代码使用第二种方法,因此您应该返回dest,但不要将其作为参数传递。我没有看过你的功能逻辑。

答案 1 :(得分:0)

Void类型方法不会返回任何内容,您可以做的是将函数类型更改为字符串并返回字符串。

答案 2 :(得分:0)

[除了分析你的函数的逻辑]一个返回类型void的函数赢了[并且可以&#39; 使用{返回任何值{1}}陈述。另外,值得一提的是,您不能使用return语句返回多个 [根据需要]。

要获得 return 值,您应该调用函数并将指针传递给return作为参数。然后,在你的函数内部,当你赋值/改变这些指针指向的位置的值时,它们将被修改,并且在从函数返回后,在调用函数中,你将拥有修改后的价值。

这是从被调用函数一次获得多个 return 值的另一种方法。

答案 3 :(得分:0)

Void表示无效,因此您无法返回具有void函数的值。 如果你想使用void函数,我假设你想使用call-by-reference而不是call-by-value。 这意味着,您指定了该函数的指针,以告知您的数组所在的位置。然后你就可以使用真实的&#39;数组,而不是副本。

答案 4 :(得分:0)

 printf("%s\n",find_replace("pooppoop poop", "poo", "hel", dest));

char * find_replace(char* src, char* from, char* to, char* dest)
 {
   dest = (char * ) malloc(sizeof(src)+sizeof(from));
   int i;
   int j;
   int check = 1;
   for (i = 0; i <= strlen(src) - 1; i++) {
     if (src[i] == from[0]) {
       for (j = 0; j <= strlen(from) - 1; i++) {
         if (src[i+j] != from[j]) {
           check = 0;}
         else {
           continue;
     }}}
     if (check == 1) {
        char * str3 = (char *) malloc(1 + strlen(&src[i]) + strlen(to));
        strcpy(str3, &src[i]);
        strcat(str3, to);
        return str3 ;
     }
    else { continue; }
  }
 return "";
}

答案 5 :(得分:0)

该行:

dest = (char * ) malloc(sizeof(src)+sizeof(from));

覆盖

中传递的地址
void find_replace(char* src, char* from, char* to, char* dest)

如果你想在内部分配内存(我认为你必须这样做,因为调用者不能知道保留多少),你必须告诉结果数据最终的调用者。要么选择out-parameter:

void find_replace(char* src, char* from, char* to, char** dest)
{
  *dest = malloc(...);

,我希望你返回指针:

char* find_replace(char* src, char* from, char* to)
{
  char* dest = malloc(...);
  // ...
  return dest;
}