2

ソースcharのインスタンスを置換charに置き換える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;
}

すべての回答をありがとう。

私はこれに変更しました(これは現在正常に動作しています)。

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

ここでの問題は、他の点ではかなり見栄えの良いコードであり、可変スコープの1つです。

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 に答える