C 我试图理解的字符串指针行为

C 我试图理解的字符串指针行为,c,pointers,C,Pointers,我编写了一个replacechar函数,它用替换字符替换源字符的实例。函数的工作原理是字符串按预期更改,但当我尝试使用函数的返回值时,puts只输出一个空行 有人能解释一下发生了什么,我需要在replacechar中更改什么来修复吗 #include <stdio.h> /* puts */ #include <string.h> /* strcpy */ #include <stdlib.h> /* malloc, free */ char* repla

我编写了一个replacechar函数,它用替换字符替换源字符的实例。函数的工作原理是字符串按预期更改,但当我尝试使用函数的返回值时,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;
}

一旦
s
指针的值增加到字符串末尾之后,它将返回该指针的值。在
replacechar()
中创建一个局部变量,并将其递增,然后返回
s

的原始值,这是因为
while
replacechar
中循环直到
\0
为止。在函数的末尾,返回指向
\0
的指针,而打印
\0
是一个空行。您应该这样管理它:

char *replacechar(char *s, char ch1, char ch2) {
    char *start = s;
    ...
    return start;
}

这里的问题是变量作用域的问题,因为代码看起来很漂亮

在replacechar中使用不同的本地字符*,如

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 */
}
#包含/*put*/
#包括/*strcpy*/
#包括/*malloc,免费*/
char*replacechar(char*s,char ch1,char ch2){
char*t=s;
而(*s){
如果(*s==ch1)
*s=ch2;
*s++;
}
返回t;
}
int main()
{
char*s=malloc(8);
strcpy(s,“aarvark”);
放置(replacechar(s,'a','z');/*打印空行*/
放置;/*按预期打印zzrvzrk*/
免费的;
返回0;
}

您真的需要从replacechar返回s吗?当您通过其指针修改字符串时,字符串仍会被修改。为了方便起见-返回结果的成本很低。为了获得令人着迷的完整性(并确保理解)*p++;只需要是p++;谢谢你,佩里,说得好。编辑。
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 */
}
#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;
}