2017-02-13 91 views
0

我剛學C和我想寫一個反轉字符數組(串)不是指數的功能,而是通過一個指針,沒有malloc的在C扭轉了字符串指針

#include <stdio.h> 
#include <string.h> 

char* reverse(char* chararray) 
{  
    char *forward = chararray; 
    char *reversed = &chararray[strlen(chararray)-1]; 

    while (reversed > forward) { 
     char revTmp = *reversed; 
     char fwdTmp = *forward; 

     *reversed-- = fwdTmp; 
     *forward++ = revTmp; 
    } 

    return reversed; 
} 

int main() 
{ 
    char string[] = "dlrow olleh"; 
    printf("%s\n",reverse(string)); 
    return 0; 
} 

現在的輸出是world,應該是hello world - 但它在中間斷了,我不知道爲什麼。必須有一些我錯過了。

+1

可能重複[在C中使用指針反轉字符串?](http://stackoverflow.com/questions/7544387/reversing-a-string-in-c-using-pointers) – Vineet1982

+1

@ Vineet1982 - 重複點是他們回答了這個問題。提議的dup如何實現這一目標? OP正在使用大不相同的實現。 – StoryTeller

回答

2

reversed將成功反轉後指向字符串中間。所以你只能打印出從字符串中的那個位置開始的東西(在這個例子中是「世界」)。您也可以通過打印string來驗證這一點,並確認它確實被顛倒過來。

改爲返回原始指針chararray

+0

哦該死的,是的......你是對的......從來沒有這樣一個簡單的錯誤:D –

1

您正在返回reversed,它指向您的字符串的中間。

您不需要返回任何內容,因爲您正在反轉輸入字符串到位

換句話說,您正在使用相同的內存塊(string)用於輸入和輸出。


只需調用的函數,然後打印該字符串:

reverse(string); 
printf("%s\n",string); 

除此之外,你不妨改變這一點:

char* reverse(char* chararray) 
{ 
    ... 
    return reversed; 
} 

爲此:

void reverse(char* chararray) 
{ 
    ... 
} 
+0

是正確的,但我想返回指針做例如像'printf(「%s \ n」,reverse(「dlrow olleh」));' –

+0

@MatthiasBurger:你可以,但是有什麼意義?函數聲明應該告訴用戶有關其目的的所有信息。你當前的聲明意味着它可能會爲輸出分配一個新的緩衝區(因爲一個函數完全按照原樣返回它的輸入是沒有意義的)。假設您將代碼作爲「黑匣子」(例如,頭文件+ lib文件)提供給其他人使用它,他們只會看到頭文件中的函數原型,並假定它必須爲輸出分配一個新的緩衝區,以後需要將其釋放。 –

+0

@MatthiasBurger - 小心。你在評論中做了什麼未定義的行爲,因爲你試圖修改文字。 – StoryTeller