1

文字列から 2 つの連続する重複要素を削除しようとしています。16 行目でセグメンテーション違反が発生しています。コメントされた 17 行目でも同じエラーが発生します。

私のプログラムのロジックについて心配しないでください。間違っているかもしれません...しかし、私はこのエラーに襲われました..助けてください...なぜこのエラーが発生するのか説明してください

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *st="fvvbbyyr";
    int i=0,j,len;
    for(len=0;st[len]!='\0';len++);
    for(i=0;i<len;i++)
    {
        if(st[i]==st[i+1])
        {
            for(j=i+2;j<len;j++)
               {
                   *(st+j-2)=*(st+j);
                   //st[j-2]=st[j];
               }
            len = len-2;
            i=-1;
        }
    }
    return 0;
}
4

1 に答える 1

4
char *st = "fvvbbyyr";

st"fvvbbyyr"読み取り専用メモリに配置できる匿名文字列を指します。

*(st+j-2) = *(st+j);

このような値を変更しようとすると、未定義の動作が発生します。

const char *文字列リテラルはこのように動作するため、ポインタを as として宣言することをお勧めします。

const char *st = "fvvbbyyr";

次に、コンパイラはいくつかの警告/エラーを出力する必要があります。むしろ配列を使用してください:

char st[] = "fvvbbyyr";

ところで、配列添字演算子[]を使用すると、コードが読みやすくなる場合があります。

st[j - 2] = st[j];

st[i+1] == st[len]さらに、ループ内で一度アクセスしています。

于 2013-02-26T17:31:57.173 に答える