【问题标题】:Return for type void function返回类型 void 函数
【发布时间】:2015-03-24 20:35:11
【问题描述】:

我正在尝试编写一个函数,该函数允许我在字符串“src”中定位子字符串“from”,并在所有情况下将“from”子字符串替换为“to”子字符串,并输出新字符串通过“目的地”;但是我认为我的代码看起来有点不确定,而且我不明白(从概念上)我将如何返回带有 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 ;

【问题讨论】:

  • 我无法按照你的函数逻辑,你能解释一下吗? str3 是什么?
  • 所以我想我在编码方面很新,但想法是创建一个长度为“src”的字符数组(直到点 i,它与 from 匹配)和长度“到”。然后我想将 src[i] 复制到我创建的 str3 和 strcat str3 和 to 上,以便创建具有它们的新字符串。

标签: c arrays string pointers void


【解决方案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);
    
  • 将指针传递给指向 char 的指针

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

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

    这样调用函数:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      Void 没有任何意义,因此您不能使用 void 函数返回值。 如果您想使用 void 函数,我假设您想使用按引用调用而不是按值调用。 这意味着,你给函数一个指针,告诉你数组的位置。然后你使用你的“真实”数组,而不是副本。

      【讨论】:

        【解决方案4】:

        [除了分析你的函数的逻辑]一个返回类型为void的函数不会[也不能]返回任何使用return语句的值。此外,值得一提的是,您也不能使用return 语句返回多个 [根据需要]。

        要在您的情况下获得 return 值,您应该调用您的函数并将指针作为参数传递给char。然后,在您的函数内部,当您分配/更改这些指针指向的位置的值时,它们将被修改,并且在从您的函数返回后,在调用者函数中,您将拥有修改后的值.

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

        【讨论】:

        • 你(或其他任何人)有什么办法可以帮助我理解我的逻辑吗?
        • @LeehoLim 你应该了解strstr() 函数以及字符串在c 中的工作原理。
        【解决方案5】:
         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 "";
        }
        

        【讨论】:

        • return strcat ...请问这是什么?
        • 不,这取决于程序员如果找不到匹配项,他想打印什么。
        • 请不要转换malloc() 的返回值——它不会增加任何价值,但会降低可读性并隐藏错误。
        • @pankajkhanduja-GameChanger C 语法如何依赖于程序员? :-) 顺便说一句,我指的是return str3 ,它缺少;
        • @sourav 谢谢。其实我在说这个 - return "";
        【解决方案6】:

        行:

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

        覆盖传入的地址

        void find_replace(char* src, char* from, char* to, char* dest)
        

        如果你想在函数内部分配内存(我认为你必须这样做,因为调用者无法知道要保留多少),你必须告诉结果数据最终进入的调用者。要么选择输出参数:

        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;
        }
        

        【讨论】:

          猜你喜欢
          • 2019-10-08
          • 1970-01-01
          • 2021-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-28
          • 2013-06-12
          • 2018-07-20
          相关资源
          最近更新 更多