2011-03-19 14 views
0

可能重複:
How to reverse a string in place in c using pointers?是否可以編寫一個可以在不使用緩衝區字符串的情況下反轉字符串的函數?

的面試問題是寫一個名爲revstr功能,可以接受字符串和扭轉它不使用字符串緩衝區即涉及指針。我該怎麼做呢?

+3

參見:http://stackoverflow.com/questions/2124600/how-to-reverse-a-string-in-place-in-c-using-pointers – 2011-03-19 11:56:29

+0

我的想法就像是有一種方法可以在相反的方向上讀取指針,這隻會實現目標? xor swap的 – Nishant 2011-03-19 12:04:49

回答

8

從頭開始和結尾同時迭代交換字符。

void revstr(char * str) { 
    int right = strlen(str) - 1; 
    int left = 0; 
    while (left < right) { 
    char c = str[right]; 
    str[right] = str[left]; 
    str[left] = c; 
    ++left; 
    --right; 
    } 
} 

可選擇使用XOR技巧沒有中間焦掉:

str[right] ^= str[left]; 
str[left] ^= str[right]; 
str[right] ^= str[left]; 

這是做一個交換的純粹荒謬的方式 - 使用這種結構的唯一原因是人造的要求說您不能將字符串數據存儲在中間變量中,並且不能調用外部函數。

+0

-0.5。我知道它在這種情況下起作用,因爲你的情況是'左'<右>,但這是過早的悲觀。除非有證明需要使代碼變得更慢(例如,剖析器已將此視爲冷點),爲何要使用它? – 2011-03-19 12:35:02

+0

@Steve Jessop:OPs「不使用緩衝區字符串」 - 只是證明你可以做到這一點,而不需要中間存儲數據。 – Erik 2011-03-19 12:36:17

+0

C標準中的任何內容都不能保證正常交換使用中間存儲,或者xor交換沒有,只是一個使用對象而另一個使用右值,所以抽象機器有所不同。無論如何,「使用」更多的存儲空間用於「左」和「右」,而不是「c」。如果你修改爲「愚蠢的異或技巧」,我會給你+1; -p – 2011-03-19 12:41:22

1

我認爲至少你需要一個char變量來執行交換操作。 您可以使用類似的東西:

char buf[SIZE]; 
    int i ; 
    char swap; 
     for (i = 0 ; i < SIZE/2; i++){ 
    swap = buf[i]; 
    buf[i] = buf[SIZE - i]; 
    buf[SIZE -i] = swap; 
    } 
+0

謝謝這正是我在他的iview程序。希望iviwer喜歡它。 – Nishant 2011-03-19 12:04:02

+0

是否可以按相反順序讀取指針?我的意思是隻讀字符串。 – Nishant 2011-03-19 12:11:33

+0

@Nishant:我完全不明白你是什麼意思,無論如何你當然可以從數組的末尾開始並且遞減指針。 – Heisenbug 2011-03-19 12:14:52

相關問題