這幾天開始去面試
多多少少免不了要考些專業科目
考題看得出來都是一些基本的C
不過有些時候我們在機上作業久了,依賴compiler久了
就真的會對程式的觀念開始模糊,其實這樣不見的是一個好事就是了
anyway,今天考了一題關於字串反轉的問題
簡單的說就是當輸入為一個"abcde"的字串
我們要如何將其轉換成"edcba"
考的就是字串的處理以及指標與陣列之間的關係
其解答為
void reverse(char *s)
{
int i, j;
char c;
for (i = 0, j = strlen(s) - 1; i < j; i++, j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
我的寫法並不像是上述的寫法,因為一時之間有些慌亂,
就用硬幹的方式把他湊出來
所以才在網路上尋找到了這個寫法
結果在實機作業的時候
一直遇到compile錯誤的情形
trace後發現問題出在s[i] = s[j]; 這行程式上
原因是因為我們在main function上call reverse時
其輸入若是"字串指標"時(char *s = "abc";)
在某些compiler會將此字串放在一個不可更改的記憶體上
因此在reverse function要做資料互換時
就會無法更改而一直出錯
因此,在這邊的處理方式為將輸入改為"字串陣列"(char s[]={'a','b','c','\0'})
用此種宣告即可以避免上述問題的發生