2

次の簡単な機能があります。

void reverse(char* str) {
    if (str == NULL)
        return;
    char* end = str;
    while(*end != NULL) {
        end++;
    }
    end--;  
    while(str < end){
        char temp = *str;
        *str++ = *end;
        *end-- = temp;
    }   
}

int main(int argc, char* argv[]) {
    char* second = "SOMETHING\0";
    cout << "Before Reverse String: " << second << '\n';
    reverse(second);
    cout << "Reverse String: " << second << '\n';
}

シンプルですね。ただし、セグメンテーション違反が数行発生しています

*str++ = *end 
*end-- = temp

私は何が欠けていますか?

ありがとう!

4

2 に答える 2

0

変化する

char* second = "SOMETHING\0";

char second[] = "SOMETHING";

注: 文字列リテラルは変更できないため\0、文字列リテラルを明示的に追加する必要はありません。

while(*end != NULL) {

する必要があります

while(*end != '\0') {

NULLNULL ポインターにのみ使用されます。

于 2013-07-17T03:35:13.360 に答える
0

文字列リテラルを変更しています:

char* second = "SOMETHING\0";

これは未定義の動作です。1 つの解決策は、リテラルを char 配列に割り当てることです。

char second[] = "SOMETHING";

また、文字列リテラルは NULL で終了するため、. を追加する必要はありません\0\0また、 while ループをの代わりにと比較するように変更する必要がありますNULL。ただし、両方とも評価される0ため、使用*endするchar方が読みやすいため、機能するはず\0です。

while(*end != '\0')
于 2013-07-17T03:37:16.957 に答える