1

以下を含む行でセグメント違反エラーが発生します。

*pointer++ = *pointer_2++

理由がわからない。

文字列はそう宣言されています(メイン内):

char *str = "Why doesn't this function work?"

そして、これは私の機能です:

void removewhitespace(char *str)
{
        // remove whitespace from the string.                                   
  char *pointer = str;
  char *pointer_2 = str;
 do{

    while (*pointer_2 == ' ' || *pointer_2 == '\n' || *pointer_2 == '\t')
      pointer_2++;

  }while (*pointer++ = *pointer_2++);

}
4

3 に答える 3

6

これは、関数が文字列をその場で変更し、文字列リテラルのアドレスを渡しているためです。文字列リテラルをその場で変更することは、未定義の動作です。

これを変える

char *str = "Why doesn't this function work?";

これに

char str[] = "Why doesn't this function work?";

あなたの機能は期待通りに動作します。

于 2012-11-02T04:40:20.097 に答える
0
char *pointer = str;

これは宛先ポインターであるため、この割り当ては必要ありません。あなたの「pointer_2」は実際の文字列を指しています。したがって、次のように使用できます。

char *ポインタ;

char *pointer_2 = str;

于 2012-11-02T06:24:51.393 に答える
0

*str のアドレスはポインタによって変更されるため、*p はアドレスを保存し、配列は値を保持します

于 2012-11-02T10:16:20.557 に答える