2

コードは、n 要素の 1 次元ベクトルを i 位置左に回転させると想定されていました。たとえば、n=8 および i = 3 の場合、ベクトル abcdefgh は defghabc に回転されます。

以下は string_reverse 関数でクラッシュします。そこに何が問題なのかを見つけることができませんでした。

#include <stdio.h>
#include <string.h>
#include < conio.h>

void string_reverse(char* str, int left, int right )
{
    char *p1 = str + left;
    char *p2 = str + right;

    while (p1 < p2) 
    {
        char temp = *p1;
        *p1 = *p2;
        *p2 = temp;
        p1++;
        p2--;
    }
}


void rotate( char* str, int k )
{
    int n = strlen( str );
    string_reverse( str, 0, k - 1 );
    string_reverse( str, k, n - 1 );
    string_reverse( str, 0, n -1 );
}


int main(int argc, char* argv[])
{
    char* string = "abcdefghijk";

    rotate( string, 3 );    
    printf("%s",string );   
    getch();
    return 0;
}



it crashes at 

*p1 = *p2;
4

3 に答える 3

6

変化する

char* string = "abcdefghijk";

char string[] = "abcdefghijk"

前者は読み取り専用の文字列リテラルを指し、後者はそのリテラルから初期化された配列です。

于 2012-04-20T19:23:30.413 に答える
4

文字列を使用して操作する場合は、文字ポインタではなく実際の文字配列を使用してください。

    char string[] = "abcdefghijk";
于 2012-04-20T19:21:39.040 に答える
1

このように、変数初期化子として割り当てられたメモリ...

char* string = "abcdefghijk";

...不変です。つまり、変更することはできず、書き込みを試みるとセグメンテーション違反が発生します。malloc()およびフレンド経由で割り当てられたメモリのみを変更できます。次のような静的文字列を使用すると、これを非常に簡単に実現できます。

char *string = strdup("abcdefghijk");

strdup()関数は内部的に呼び出し、malloc()ソース文字列をターゲットにコピーします。あなたはすでに#include-ingstring.hを行っているので、strdup()関数プロトタイプは追加のコードなしで既に利用可能です。

于 2012-04-20T19:17:35.110 に答える