0

私は自分のC/C++スキルをブラッシュアップしています。文字列を逆にする関数を実装しようとしましたが、プログラムを実行するたびにセグメンテーション違反(コアダンプ)が発生し続けます。

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

void revstr(char *str);

int main()
{
    char *str = "hello mofo!";
    revstr(str);
    puts(str);

    return 0;
}

void revstr(char *str)
{
    int start = 0;
    int len = strlen(str);
    int mid = len / 2;
    int i, t;
    printf("start: %d, mid: %d,len: %d\n", start, mid, len);

    for ( i = start; i < mid; ++i )
    {
        printf("str[%d] swapping to str[%d]: %c, %c\n", i, len - 1 -i, str[i], str[len - 1 - i]);
        t = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = t;
    }
}

このソリューションでも、同じセグメンテーション違反が発生します。

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

void revstr(char *str);

int main()
{
    char *str = "hello mofo!";
    revstr(str);
    puts(str);

    return 0;
}

void revstr(char *str)
{
    char *end = str;
    char t;
    if ( str )
    {
        while ( *end != 0 )
            end++;
        end--;

        while ( str < end )
        {
            t = *str;
            *str++ = *end;
            *end-- = t;
        }
    }
}
4

1 に答える 1

5
char *str = "hello mofo!";

str文字列リテラルです。デフォルトconstはです。未定義の動作に変更してください。代わりに次のようにします。

char str[] = "hello mofo!";
于 2013-02-03T23:03:15.587 に答える