0
int main()
{
  char *p="abcd";
  while(*p!='\0') ++*p++;
  printf("%s",p);
  return 0;
}

コードが実行されない理由を理解できません。問題はステートメント++*p++にありますが、何が問題なのですか?

4

4 に答える 4

1

Pは、文字列 ' 'を変更しようとしているときに*p="abcd"; 定数文字列リテラルを指します。セグメンテーション違反が発生する可能性があります。++*p++"abcd"a'b'++*p

`++*p++` means `++*p` then `p++`
                 ^
                 | this operation try to modify string constant 
于 2013-05-18T04:40:06.363 に答える
0
char *foo = "abcd";
char bar[] = "abcd";

と の違いを考えてみましょfoobarfoo文字列リテラル用に予約されたメモリを指すように初期化されるポインタです。bar文字列リテラルに初期化された独自のメモリを持つ配列です。その値は、初期化中に文字列リテラルからコピーされます。などを変更するbar[0]のは適切ですが、 ではありませんfoo[0]。したがって、配列宣言が必要です。

ただし、配列宣言をインクリメントすることはできません。これは、ポインター変数または整数変数の操作です。さらに、ループはp印刷される前にポイントする場所を変更するため、文字列の元の場所をどこかに保持する必要があります。したがって、ポインタまたは整数宣言も必要です。

これを念頭に置いて、コードを次のように変更することをお勧めします。

int main()
{
    char str[] = "abcd";

    /* Using a pointer variable: */
    for (char *ptr = str; *ptr != '\0'; ++*ptr++);

    /* Using a size_t variable: */
    for (size_t x = 0; str[x] != '\0'; str[x++]++);

    printf("%s", str);
    return 0;
}
于 2013-05-18T09:04:39.940 に答える
0
//char *p="abcd";//"string" is const char, don't change.
  char str[]="abcd";//is copied, including the '\0' to reserve space
  char *p = str;
  while(*p!='\0') ++*p++;
//printf("%s",p);//address pointing of 'p' has been changed
  printf("%s",str);//display "bcde"
于 2013-05-18T08:37:03.457 に答える