2013-02-12 68 views
0

我有下面的代碼,它的主要用途是反轉字符串的字符。因此,例如,字符串I love cats將被轉換爲stac evol I在C中反轉字符串時出現分段錯誤

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

void reverseString(char *str) 
{ 
    int size = strlen(str); 
    char *end = str + size - 1; 
    char tmp; 

    while (end > str) { 
    tmp = *str; 
    *str = *end; 
    *end = tmp; 
    end--; 
    str++; 
    } 
} 

int main() 
{ 
    char *str = "Y U SEGMENTATION FAULT?"; 
    reverseString(str); 

} 

當我運行這個,我得到一個分段錯誤,我看不出爲什麼。另外,我的另一個問題是這個函數的時間複雜度(大O)。我相信它應該是O(n/2),因爲我沒有經歷所有的陣列,只是它的一半。我對嗎?

+0

'O(N/2 )== O(0.5 * n)== O(c * n)== O(n)',所以反轉字符串在'O(n)' – 2013-02-12 10:42:37

+2

'char str [] =「YU分段故障? ;' – hmjd 2013-02-12 10:43:14

+0

我真的很抱歉。我沒有看到其他問題。這是重複的是的。 – 2013-02-12 10:45:31

回答

1

您正試圖修改字符文字,即只讀數據段中的字符串。製作它的一個副本/重複上的strdup堆,例如:

char *str = strdup("It's OK now"); 

或使其本地陣列(放置在堆棧上的字符串):

char[] str = "It's OK now"; 
+0

但根據http://stackoverflow.com/questions/8732325/how-to-declare-strings-in-c - 如果我用指針聲明我的字符串,我可以修改它,對吧? – 2013-02-12 10:43:15

+0

不,您可以將您的字符串聲明爲本地數組,如hmjd所示,這將是一個不同的故事。 – piokuc 2013-02-12 10:44:27

+0

@HommerSmith'char * foo =「bar」;'和'char foo [] =「bar」;''是初始化的方法之一。前者將只讀數組轉換爲指針並存儲指針。後者*將只讀數組複製到新的可修改數組中。 – Sebivor 2013-02-12 11:11:07