2017-05-26 127 views
0

我需要寫一個遞歸函數這就是得到一個字符串,然後只打印字母(captial &小)從年底開始遞歸處理字符串

for exemple: 
str={"abc123#@!456DEF&^65gHj"} 
Reducing(str); 
output: jHgFEDcba . 

,但即時通訊停留在如何獲得的部分在功能轉到下一個字符 所有我能做的就是打印的最後一個字符和多數民衆贊成IM卡......請幫助

here's my code: 

void Reducing(char str[]) 
{ 
    if (str[0] == '\0') 
     return ; 

    if ((str[strlen(str)-1] <= 122 && str[strlen(str)-1] >= 97) || (str[strlen(str)-1] <= 90 && str[strlen(str)-1] >= 65)) 
     putchar(str[strlen(str)-1]); 

    Reducing(str+(strlen(str))); 
} 
+2

你可以做一個簡單的版本,這是剛剛反轉字符串是什麼?然後修改它以過濾。並提示:它不應該是尾遞歸(嗯,它可以,但是你忽略了這一點)。 –

+1

不要在每次迭代時嘗試計算'strlen'。每次迭代只需移動一個角色,然後放鬆一下。 –

+0

使用'isalpha()'會更乾淨,並刪除幻數。 –

回答

1

如何使用的只是str[0]代替str[strlen(str) - 1]並通過str + 1的遞歸:

void Reducing(char str[]) 
{ 
    if (str[0] == '\0') 
     return ; 

    if ((str[0] <= 122 && str[0] >= 97) || 
      (str[0] <= 90 && str[0] >= 65)) 
     putchar(str[0]); 

    Reducing(str + 1); 
} 
+0

多數民衆贊成多多少少我第一次嘗試,但它打印frim開始結束,我希望它做相反的,這就是爲什麼我嘗試使用「str [strlen(str)-1]」 –

+2

@ monkey.D.Ganga更改該功能的順序,然後 –

+0

@ monkey.D.Ganga啊好吧,我沒有注意到... –

4

我相信這次演習的整點下移串一個字符每遞歸一步,直到你結束,然後pri在返回途中返回當前字符(在遞歸調用之後)。你不應該使用strlen

字符串是由零(或NUL)字符終止的內存中的字符序列。通過在字符串中提供第一個字符的地址,您可以通過向地址添加偏移量來查找所有其他字符。一個字符串也可以被認爲是一個有頭的蛇(第一個字符)和一個尾巴(剩下的字符)。頭是位於字符串地址的單個字符。 尾部是位於地址加上的字符串。

爲了向後打印字符串,如果字符串爲空(它的頭部爲NUL),那麼我們不必做任何事情。否則,如果我們通過遞歸地調用向後的打印函數向後打印尾部,然後打印頭部字符,那麼我們完成了我們的目標。

+0

所以我應該如何向下移動字符串一個字符? –

+0

將1加到指針('str + 1'或'&str [1]')。 – pat

+0

什麼指針?我不瞭解你 –

1

首先,您通常使用一個字符串從中讀取界面:

void reducing(const char*);

,如果你想打電話給你的字符串字面量函數(const的是這裏重要的你通常需要)。

其次,c標準庫在ctype標頭中提供了諸如isalpha()之類的函數來檢查char是否屬於某些標準類別。

最後但並非最不重要的是,你真正想做的是看下一個字符,所以將指針向前移動一次,然後再次調用自己,直到你閱讀'\0'