递归处理字符串

问题描述:

我需要写一个递归函数这就是得到一个字符串,然后只打印字母(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()'会更干净,并删除幻数。 –

如何使用的只是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啊好吧,我没有注意到... –

我相信这次演习的整点下移串一个字符每递归一步,直到你结束,然后pri在返回途中返回当前字符(在递归调用之后)。你不应该使用strlen

字符串是由零(或NUL)字符终止的内存中的字符序列。通过在字符串中提供第一个字符的地址,您可以通过向地址添加偏移量来查找所有其他字符。一个字符串也可以被认为是一个有头的蛇(第一个字符)和一个尾巴(剩下的字符)。头是位于字符串地址的单个字符。 尾部是位于地址加上的字符串。

为了向后打印字符串,如果字符串为空(它的头部为NUL),那么我们不必做任何事情。否则,如果我们通过递归地调用向后的打印函数向后打印尾部,然后打印头部字符,那么我们完成了我们的目标。

+0

所以我应该如何向下移动字符串一个字符? –

+0

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

+0

什么指针?我不了解你 –

首先,您通常使用一个字符串从中读取界面:

void reducing(const char*);

,如果你想打电话给你的字符串字面量函数(const的是这里重要的你通常需要)。

其次,c标准库在ctype标头中提供了诸如isalpha()之类的函数来检查char是否属于某些标准类别。

最后但并非最不重要的是,你真正想做的是看下一个字符,所以将指针向前移动一次,然后再次调用自己,直到你阅读'\0'