2011-03-07 69 views
5

我想出在C下述溶液中逆轉的字符串:反向用C溶液中的字符串段錯誤

#include <stdio.h> 

void reverse(char * head); 

void main() { 

    char * s = "sample text"; 
    reverse(s); 
    printf("%s", s); 
} 

void reverse(char * head) { 

    char * end = head; 
    char tmp; 

    if (!head || !(*head)) return; 

    while(*end) ++end; 

    --end; 

    while (head < end) { 
    tmp = *head; 
    *head++ = *end; 
    *end-- = tmp; 
    } 
} 

但是我的解決方案是段錯誤。根據GDB,違規行如下:

*head++ = *end; 

在while循環的第一次迭代中的行段錯誤。終點指向字符串「t」的最後一個字符,頭指向字符串的開頭。那麼,爲什麼這不起作用呢?

+1

在末尾添加 '\ 0'。 – malinois 2011-03-07 13:20:39

+5

的\ 0,因爲你把一個解釋是在字符串 – Erik 2011-03-07 13:22:28

回答

32

變化

char * s = "sample text"; 

char s[] = "sample text"; 

「樣本文本」 是一個字符串,其可駐留在讀只是你的地址空間的一部分。使用數組語法確保將此字符串複製到可寫的堆棧中。

+1

Upvoting你,而不是codaddict的一致答案是自動的。 – JeremyP 2011-03-07 13:24:44

+0

非常有趣的..感謝您的解釋。 – Sam 2011-03-07 13:34:41

+0

也許稍微偏離主題,但什麼是具有隻讀存儲器「示例文本」的好處?爲了節省空間? – Jeff 2011-03-09 22:43:30

11

s指向一個字符串:

char * s = "sample text"; 

在功能reverse你試圖修改字符串常量導致不確定的行爲。

爲了解決這個問題使s字符數組:

char s[] = "sample text";