我正試圖使用遞回法反向列印一個字串。然而,下面的程式并沒有像預期的那樣作業。原因是什么?
#include <stdio.h>
int main()
{
char arr[]="rama"/span>;
fun(arr)。
}
int fun(char *p)
{
static int i=0;
if((p[i]) == ''/span>)
return;
else; else.
{
i ;
fun(p[i])。
printf("%c"/span>, p[i])。
}
}
uj5u.com熱心網友回復:
可能你正在尋找:
void fun(char *p) {
if (*p) {
fun(p 1) 。
printf("%c"/span>, *p)。
}
}
uj5u.com熱心網友回復:
在遞回的情況下,程式向函式傳遞了一個char型別,而你希望這是個指標。在一個只有一個字符的字串上進行迭代是不可能的,我們需要知道我們在字串中的位置。
正如各種評論所指出的那樣,使用static是忽略了撰寫遞回函式的意義,因為它實際上引入了一個全域變數。
事實上,使用一個索引變數根本就沒有必要。你可以簡單地使用指標作為一個引數,并將其作為引數。解除參考以獲得當前所指向的字符,并遞增它以使其指向下一個字符。
更正后的代碼,有幾處改進:
char *arr = "rama"; //我們不是在修改字串,所以一個指向字串字面的指標就可以了。
fun(arr);
putchar('
'); //在程式結束時列印一個新行。
}
void fun(char *p)
{
if (*p == '') // Get the character the pointer currently points to
return; //沒有必要在這里回傳一個else。
fun(p 1); //傳遞增量指標。
putchar(*p); //列印取消參考的指標。如果我們只是列印一個char,就不需要printf了。
}
//span>在使用函式之前先宣告它。
//它不回傳任何東西,所以回傳型別應該是 "void"。
void fun(char *p)。
int main(void) //不使用命令列引數時正確的main簽名
另一個選擇是讓函式尾部遞回。 (靈感來自Eugene Sh.的評論)。這需要一個額外的索引引數,但可以讓你在基本情況下列印最后的換行。
#include <stdio.h>/span>
#include <string.h>
void fun(char *p, size_t idx);
int main(void)
{
char *arr = "rama"/span>;
fun(arr, strlen(arr) - 1) 。
}
void fun(char *p, size_t idx)
{
//在基本情況和遞回情況下都會發生。
putchar(p[idx])。
//基礎案例
if (idx == 0U)
{
putchar('
')。)
return;
}
// 遞回案例; return; }
fun(p, idx - 1)。
}
uj5u.com熱心網友回復:
你的fun有回傳型別int,但你沒有回傳任何整數。 你必須在main之前宣告函式,因為fun的主體在main下面。 fun的接收型別是char *,但你發送的是char。
#include <stdio.h>
int fun(char *p)。
int main(){
char arr[]="rama"/span>;
fun(arr)。
}
int fun(char *p){
static int i=0;
if((p[i]) == ''/span>)
return 0。
fun((p 1))。
printf("%c"/span>, p[i])。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/315485.html
標籤:
