2011-01-24 212 views
0

我想學習C的基礎知識,但我無法弄清楚爲什麼這段代碼不起作用。 reverse()中的while循環會導致總線錯誤。我在編程面試書中發現了幾乎完全相同的代碼作爲一個有效的解決方案,但是這些或者其他類似的方法我都沒有在這裏發佈過,但沒有發生總線錯誤。In-Place String Reverse in C

#include <stdio.h> 

void reverse(char* str) { 
char* end = str; 
char tmp = 0; 
if(str) { 
    while(*end) { 
    end++; 
    } 
    --end; 
    while(end>str) { 
    tmp = *end; 
    *end-- = *str; 
    *str++ = tmp; 
    } 
} 
} 

int main() { 
char* a = "12"; 
puts(a); 
reverse(a); 
puts(a); 

return 0; 
} 
+1

見http://stackoverflow.com/questions/4493139/are-string-literals-const等諸多問題(如至少每週一次)對SO。 – ephemient 2011-01-24 19:05:26

回答

4

問題是您正在嘗試反轉一個只讀的常量字符串。將main中的a的聲明更改爲char a[] = "12";以使其成爲可寫的char數組而不是

+0

謝謝!這有很大幫助。 – Tiki 2011-01-24 19:11:32

2

您正在嘗試更改導致未定義行爲的字符串文字。

變化

char* a = "12"; 

char a[] = "12"; 
+0

哇,非常感謝! – Tiki 2011-01-24 19:10:42

-2

因爲endstr指向同一個內存位置 - >它們是同一對象的兩個不同的名字。你能避免使用兩個變量:

char foo[20] = "abcdefghi", tmp; 
int counter = 0, length = strlen(foo); 

for(counter, counter < length/2; counter++) { 
    tmp = foo[counter]; 
    foo[counter] = foo[length - counter]; 
    foo[length - counter] = tmp; 
} 
+0

「對象」?這是C! (無論如何,`end`和`str`只指向幾行代碼的同一位置。) – ladenedge 2011-01-24 19:07:31