2

我编写了一个替换字符函数,它用替换字符替换源字符的实例。该函数的工作原理是字符串按预期更改,但是当我尝试使用函数的返回值时,puts 只输出一个空行。

有人可以解释发生了什么以及我需要在 replacechar 中更改什么来修复。

#include <stdio.h>  /* puts */
#include <string.h> /* strcpy */
#include <stdlib.h> /* malloc, free */

char* replacechar(char* s, char ch1, char ch2) {
   while (*s) {
      if (*s == ch1)
         *s = ch2;

      *s++;
   }

   return s;
}

int main()
{
   char* s = malloc(8);

   strcpy(s, "aarvark");

   puts(replacechar(s, 'a', 'z')); /* prints blank line */

   puts(s);  /* prints zzrvzrk as expected */

   free(s);

   return 0;
}

感谢所有的回复。

我已更改为此(现在可以正常工作)。

char* replacechar(char* s, char ch1, char ch2) {
   char* p = s;
   while (*p) {
      if (*p == ch1)
         *p = ch2;

      p++;
   }

   return s;
}
4

4 回答 4

5

s一旦指针增加超过字符串的末尾,它就会返回指针的值。在 中创建一个局部变量replacechar(),并将其递增,并返回 的原始值s

于 2012-07-14T21:11:26.200 回答
0

那是因为while循环replacechar递增s,直到\0. 在函数的末尾,您将返回指针,该指针指向\0并且打印\0是一个空行。你应该像这样管理它:

char *replacechar(char *s, char ch1, char ch2) {
    char *start = s;
    ...
    return start;
}
于 2012-07-14T21:13:32.330 回答
0

你在这里的问题,其他看起来很漂亮的代码,是可变范围之一。

在 replacechar 中使用不同的本地 char*,例如

char* replacechar(char* s, char ch1, char ch2) {
   char* tmpstr;

   tmpstr=s;
   while (*tmpstr) {
      if (*tmpstr == ch1)
         *tmpstr = ch2;

      tmpstr++;  /* Note, no "*" here as in your code.  */
   }

   return s; /* s has remained unchanged */
}
于 2012-07-14T21:21:56.700 回答
0
#include <stdio.h>  /* puts */
#include <string.h> /* strcpy */
#include <stdlib.h> /* malloc, free */

char* replacechar(char* s, char ch1, char ch2) {
   char* t = s;
   while (*s) {
      if (*s == ch1)
         *s = ch2;

      *s++;
   }

  return t;
}

int main()
{
   char* s = malloc(8);

   strcpy(s, "aarvark");

   puts(replacechar(s, 'a', 'z')); /* prints blank line */

   puts(s);  /* prints zzrvzrk as expected */

   free(s);

   return 0;
}
于 2012-07-14T21:23:14.110 回答