2013-02-03 65 views
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

您不能修改文字。現在我已經給出了有用的建議,當你在實際代碼中反轉字符串時,請注意'std :: reverse'。 – chris

+0

你需要展示你的工作。例如,分段故障發生在哪條線上? –

+0

謝謝,@chris,我知道'std :: reverse',但我試圖用C風格做到這一點。 – Osuvaldo

回答

5
char *str = "hello mofo!"; 

str的字符串字面量,它的默認const,改變它是不確定的行爲,你想這個代替:

char str[] = "hello mofo!"; 
+0

'char * str =「hello mofo!」;'**與const char * str =「hello mofo!」不一樣**。此外,由於歷史原因,字符串文字具有'char []'和** not **'const char []'類型。 – 2013-02-03 23:07:12

+2

@ H2CO3:不符合標準工作草案中的2.14.5/8。 –

+0

@ H2CO3:更正'char * str =「hello mofo!」;'不同於const char * str =「hello mofo!」;'。第二個版本是正確的。第一個版本依賴於C++的棄用「特性」。它沒有改變底層類型的類型,但改變了指針類型,所以使用C庫並不痛苦。但導致這個問題未定義的行爲。 –