一些意見和批評:
並不需要張貼代碼math.h
和stdlib.h
頭文件。雖然char strArray[30]
足夠大以容納輸入字符串,但最好在字符串初始化程序中使用空括號,除非您需要比初始字符串更大的特定大小。這不太容易出錯,而且更容易,因爲不需要計算字符,也不需要記住爲空終止符包含空格。您可能希望將puts("");
移至stringReverse()
之後,因爲此功能不會打印換行符。對於像這樣的東西,通常使用putchar('\n');
似乎更好; putchar()
旨在打印只有一個字符,所以是正確的工具。
看來,與if (strArray != "\n") {}
聲明的目標是檢查是否第一個字符是換行符,但有幾個問題。首先,"\n"
是一個字符串,而不是一個字符;接下來,strArray
是指向數組strArray[]
的第一個字符的指針,而不是第一個字符本身。在輸入字符串中沒有'\n'
字符,所以即使此條件被正確寫入,也總是如此,並且此代碼將進入無限遞歸。最後,傳遞給stringReverse()
的參數從不改變,所以遞歸無法結束。爲了遞歸成功,基本情況必須被收斂。
一個解決方案是比較陣列的第一個字符與'\0'
。如果第一個字符不是空終止符,則再次調用stringReverse()
函數,這次的值爲strArray + 1
。該程序將繼續遞歸調用stringReverse()
,直到傳入一個空字符串爲止,此時最後一次呼叫stringReverse()
返回給它的調用者(先前調用stringReverse()
),在返回給調用者之前打印字符串的最後一個字符,....每個stringReverse()
幀都按照調用它們的相反順序返回,並且這些幀中的每一個都打印該字符串的一個字符,直到最後到達第一幀,並且打印第一個字符,然後回到main()
。
請注意,在函數調用中,實際上大多數表達式中,數組衰減爲指向其第一個元素的指針。因此,在stringReverse()
strArray
是一個指向char
的指針,指向調用者提供的作爲參數的數組的第一個元素。另請注意,在函數聲明中,如void stringReverse(char strArray[])
將數組類型調整爲適當的指針類型,因此此聲明等效於void stringReverse(char *strArray)
。
#include <stdio.h>
void stringReverse(char strArray[]);
int main(void)
{
char strArray[] = "Print this string backwards.";
stringReverse(strArray);
putchar('\n');
return 0;
}
void stringReverse(char strArray[])
{
if (*strArray != '\0') {
stringReverse(strArray + 1);
putchar(*strArray);
}
}
程序輸出:
.sdrawkcab gnirts siht tnirP
比較'strArray = 「\ n」'永遠是正確的,因爲你在做指針比較,而不是比較實際的字符串!使用'strcmp'來進行字符串比較。 –
void f(char \ * a,char \ * b){char \ * t; if(a> = b)return; t = * a; * a = * b; * b = t; f(++ a , - b);} char \ * h(char \ * a){if(a)f(a,a + strlen(a)-1); return a;}調用的函數是h()遞歸函數是f(我不確定是否寫入-1) – RosLuP
@ RosLuP--註釋中的代碼有錯誤:'char * t; ' - >'char t;'。但是,除此之外它應該工作。雖然,OP似乎希望反向打印一個字符串,而不是反轉一個字符串。這可能比OP想要的要多一點,我懷疑練習的重點是理解堆棧幀。儘管如此,你應該把你的評論變成一個完整的答案,並附帶工作示例代碼;這會對下面的答案做出很好的補充。 –