c語言中所謂的字串不過是字元陣列,後跟乙個0x00字元標識結尾,所以反轉起來很容易,只要乙個迴圈依次將第乙個字元和最後乙個字元交換,第二個字元和倒數第二個字元交換……如果最中間有兩個字元(即需要反轉的字串長度為偶數),那就交換,如果最中間有乙個字元(即需要反轉的字串長度為奇數),那就不需要碰它。還有就是最後乙個用來標識字串結尾的0x00字元不用動它。
這道題目通常是考察三個方面,一是對指標和字串的理解,二是是否進行合法性檢查,例如輸入引數為空指標時是否進行檢查,三是返回值是否是恰當,即使你通過引數返回了反轉後的字串指標,也建議在返回值裡再返回一下,就像strcpy函式實現的那樣。其實還有第四點往往是大家都忽略了的,那就是unicode問題,如果傳入的字串指標指向的是unicode字串,那麼反轉的時候就不能乙個字元乙個字元的處理了,不過似乎大多數面試官都沒對這一點有過要求,如果你在筆試或面試中遇到這個問題,我建議你想監考或面試官詢問一下是否需要考慮unicode。我面試的時候因為被面試官弄的很緊張,也忘記了這點,寫完後檢查**準備交過去時才想起來,索性就當不知道這回事……呵呵。
有了上面這幾點,我們就可以很容易地用c語言寫出這個函式了。
char *revstr(char *str, size_t len)**很簡單,就不多介紹了,只是為什麼我給這個函式叫revstr而不是strrev呢?我開始時也是給它叫strrev,只是鏈結時卻出錯了,這時我才發現vs2005的c++編譯器已經在string.h中中提供了乙個strrev函式(這看起來並不是c標準庫函式,我不知道還有哪些編譯器提供了這個函式),如果你安裝了crt**包的話可以找到這個函式的實現。我們來看一下它是如何實現的吧。}return str;
}
char * __cdecl _strrev (這與我上面給出的函式並沒有什麼本質的不同,只是只傳入了乙個引數,並沒有傳入字串長度,但是我覺得還是傳入這個長度比較好,因為有可能我們並不想反轉整個字串,如果採用我給出的那種實現,乙個長度為10的字串,我們只想反轉前7個字元也是可以的。還有就是微軟給出的這個實現並沒有判斷是否傳入空指標,不過我覺得這並不是個大問題,這要取決於你的具體期望,就像我在啟明星辰的筆試中遇到了一道題目,要求我實現乙個函式將傳入的字串中的小寫字母轉換成大寫字母,那麼如果傳入的字串是小寫字母和數字混合的呢?函式應該出錯還是應該跳過數字繼續處理?兩種方式都沒錯,怎麼選擇要取決於你或者閱卷人對這個函式的期望,在筆試或面試中你可以詢問監考活面試官,如果沒有得到準確的描述,你怎麼實現都是正確的。char * string
)return(start);
}
C語言字串反轉函式
c語言中所謂的字串不過是字元陣列,後跟乙個0x00字元標識結尾,所以反轉起來很容易,只要乙個迴圈依次將第乙個字元和最後乙個字元交換,第二個字元和倒數第二個字元交換 如果最中間有兩個字元 即需要反轉的字串長度為偶數 那就交換,如果最中間有乙個字元 即需要反轉的字串長度為奇數 那就不需要碰它。還有就是最...
C語言字串反轉函式
c語言中所謂的字串不過是字元陣列,後跟乙個0x00字元標識結尾,所以反轉起來很容易,只要乙個迴圈依次將第乙個字元和最後乙個字元交換,第二個字元和倒數第二個字元交換 如果最中間有兩個字元 即需要反轉的字串長度為偶數 那就交換,如果最中間有乙個字元 即需要反轉的字串長度為奇數 那就不需要碰它。還有就是最...
字串反轉(C語言
功能 字串反轉 需要考慮當下標為0時是否跳出迴圈,所以此處演算法的核心在於length 0和 length 考慮最大下標為lentht 1 該演算法的缺點是 1,輸出陣列長度應該有輸入陣列確定 2,陣列最好為動態記憶體分配 3,最好封裝為函式,但是函式命名不能為strrev,該函式名為vs的內建函式...