2008年3月25日 星期二

字串反轉遇到的問題--已解決

這幾天開始去面試
多多少少免不了要考些專業科目
考題看得出來都是一些基本的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'})
用此種宣告即可以避免上述問題的發生

1 則留言:

pcmcia 提到...

我是想到implement一個stack,
看來也不怎麼好的樣子:P