使用递归比较c中的两个字符串



我需要编写一个程序,使用递归比较两个字符串,例如S1和S2,其中S1 &gt返回1,0和-1;S2, s1 == S2 and s1 <分别s2。>

对于我的任务,我不能使用任何string.h库。

我是递归的初学者,掌握了处理整数/数组场景的窍门。然而,在处理这些字符串时,我似乎无法建立"终止条件"。和"递归条件";在这件事上,我请求大家的善意指导。

正文是由我的教授作为模板提供的,所以我真的没有什么可以编辑它的这一部分。

#include <stdio.h>
#include <string.h>
#define INIT_VALUE 100
int rStrcmp(char *s1, char *s2);
int main()
{
char source[40], target[40], *p;
int result = INIT_VALUE;
printf("Enter a source string: n");
fgets(source, 40, stdin);
if (p=strchr(source,'n')) *p = '';
printf("Enter a target string: n");
fgets(target, 40, stdin);
if (p=strchr(target,'n')) *p = '';
result = rStrcmp(source, target);
printf("rStrcmp(): %d", result);
return 0;
} 

到目前为止我写的递归代码:

int rStrcmp(char *s1, char *s2)
{
// The terminating conditions:
if (*s1 == '' && *s2 == '') //  both strings end together
return 0;
else if (*s1 == '') // s1 ends first (s1 smaller)
return ‐1;
else if (*s2 == '')  // s2 ends first (s1 larger)
return 1;
else if (*s1 < *s2) // ASCII char in s1 < s2 : (s1 smaller)
return ‐1;
else if (*s1 > *s2)  // ASCII char in s1 > s2 : (s1 larger)
return 1;     
else // recursive condition
{
rStrcmp(s1+1,s2+1) // moves the address to point to the next char 
}
}

我想我大概知道我的错误是什么,那就是我在地址中比较整个字符串而不是单个字符。有没有什么方法可以让我写程序来比较两个字符串中的每个字符?

征求大家对这件事的善意指导。我可以用迭代很容易地解决这个问题,但我必须用递归来解决它,我真的不能理解字符串的递归。

编辑:这个程序可以编译和运行。然而,当我输入测试用例时,例如:

s1 = abc123S2 = abc123f

输出返回1。它实际上应该是-1

s1 = abc123S2 = abcdef

输出返回1。这实际上也应该是-1,因为s1中的字符'1'的ASCII值低于s2中的'd'。

你给我们的程序不是你真正使用的,因为它不编译,缺少一个;。我猜它是在递归rStrcmp调用之后出现的。

你应该在你的编译器上激活警告,你会发现

In function ‘rStrcmp’: .code.tio.c:60:1: warning: control reaches end of non-void function [-Wreturn-type] }

实际上,在函数rStrcmp中,递归行应该是:

...
else // recursive condition
{
return rStrcmp(s1+1,s2+1); /* the return was missing here */
}
...

正如在注释中指出的那样,您可以通过删除else来简化代码,因为在返回之后,您不再处于函数中:

int rStrcmp(char *s1, char *s2)
{
// The terminating conditions:
if (*s1 == '' && *s2 == '') //  both strings end together
return 0;
if (*s1 == '') // s1 ends first (s1 smaller)
return ‐1;
if (*s2 == '')  // s2 ends first (s1 larger)
return 1;
if (*s1 < *s2) // ASCII char in s1 < s2 : (s1 smaller)
return ‐1;
if (*s1 > *s2)  // ASCII char in s1 > s2 : (s1 larger)
return 1;     
// recursive condition
return rStrcmp(s1+1,s2+1); // moves the address to point to the next char 
}

最后一步,您可以在main函数中添加一些格式化信息,以获得更好的输出:

result = rStrcmp(source, target);
printf("rStrcmp(): %dn", result);
printf("'%s' %c '%s'n", source, result == 0 ? '=' : result < 0 ? '<' : '>' , target);

最新更新