2012-06-06 109 views
-1

可能重複:
How do you reverse a string in place in C or C++?
Why is this C code causing a segmentation fault?
Modifying value of char pointer in c produces segfaultC++段錯誤:char指針

運行一個非常簡單的代碼示例

#include <stdlib.h> 
#include <iostream> 

char* last_char(char* s){ 
    char* last = s; 
    while (*last) ++last; 
    return last; 
} 

char* in_place_reverse(char* s) { 
    char* left = s; 
    char* right = last_char(s); 
    char temp; 

    while(left < right) { 
    temp = *left; 
    *left = *right; 
    *right = temp; 

    left++; 
    right--; 
    } 

    return s; 
} 

int main(){ 
    char * s = "letters\n"; 
    std::cout << in_place_reverse(s); 
} 

我所有的時間

Segmentation fault 

但是從我的觀點來看,我沒有在代碼中做任何非法的事情。 請幫我判斷出了什麼問題。

P.S.我編譯

g++ example.c 
+1

您應該運行在調試該代碼。它會告訴你哪條線路導致了seg-fault,你應該能夠從那裏向後工作。 –

+0

請注意,你的函數last_char返回分隔符'\ 0',所以如果你的代碼不會segfault,那麼'std :: cout'將不會輸出任何內容,因爲你的第一個字符串在返回後是'\ 0'。 – Nobody

+0

[這個反轉字符串的代碼非常短](http://stackoverflow.com/a/6560310/176769)。 – karlphillip

回答

5

兩個問題:

  1. 您試圖修改字符串文字。這可能工作,它可能不會,也可能會崩潰。這是調用未定義的行爲。使用char s[] = "letters\n"來製作一個可變的副本。
  2. last_char()實際上在字符串的末尾返回一個指向標記的指針 - 它指向最後一個字符之外。將return last更改爲return last - 1。否則,你也會移動標記,這幾乎肯定不是你想要的。 (請注意,這會返回一個指向垃圾如果字符串的長度爲零。你應該快速成功地in_place_reverse()如果*s == '\0'避免這種複雜性。)
+0

你確定關於#2嗎? 我已經單獨測試過它,它總是返回最後一個字符。 如果循環是'while(* last ++)',它會返回'\ 0';' – meandre

+0

是的。 'last_char()'僅在'!* last'時纔會返回'last'。 – cdhowie

+0

啊,現在我明白了) – meandre

2

您正在修改字符串文字和字符串文字是不可修改的。

使用char s[] = "letters\n";代替