反轉字符串的另一種標準方法是使用指針從字符串的開頭和結尾開始工作,每次迭代交換兩個字符。其交換代替原始的字符串(複印一份,如果你需要保留原始,或通過第二串並放置顛倒字符串中有)
/** strrevstr - reverse string, swaps 2 chars per-iteration.
* Takes valid string and reverses, original is not preserved.
* If 's' is valid and non-empty, returns pointer to 's',
* returns NULL otherwise.
*/
char *strrevstr (char *s)
{
if (!s || !*s) { /* validate string is not NULL and non-empty */
printf ("strrevstr() error: invalid string\n");
return NULL;
}
char *begin = s; /* pointers to beginning and end, and tmp char */
char *end = begin + strlen (s) - 1;
char tmp;
while (end > begin) /* swap both beginning and end each iteration */
{
tmp = *end;
*end-- = *begin;
*begin++ = tmp;
}
return s;
}
正如你所知道的,有多種方式要解決這個問題,通過提供這些和其他答案,您應該能夠調整解決方案以滿足您的需求。
每種方法都有優點和缺點。動態分配一個新的內存塊來保存反向字符串沒有什麼問題,它只是增加了一個額外的責任:(1)保留一個指向新塊的起始地址的指針,這樣(2)當它不再被釋放時需要。如果您需要保留原始字符串,則將指針傳遞給足夠大小的字符數組以保存反轉字符串是保留原始字符串的另一個選項。
查看所有答案,並讓我知道如果您有任何問題。
請更具體地說明什麼是不工作。它是否存在分割?未能編譯?給出不正確的結果? – merlin2011
請寫出具有一致風格且可讀性強的代碼。而且,main()的成功值是'0'。或者更準確地說,是'EXIT_SUCCESS'。最後,如果你扭轉了字符串,你應該想!你需要交換多少個字符?然後你會明白爲什麼它不起作用。 –
您正在返回本地數組的地址,但數組已分配到堆棧上,並且在函數返回時不再可用。你需要做以下三件事之一:(1)通過調用'malloc',讓'inverse'在堆上分配數組,(2)讓調用者傳遞一個指向所需結果數組的指針,或者(3) '在原地顛倒參數字符串。 –