字符串的分配,两个字符串的递归函数合二为一

时间:2015-01-25 06:39:44

标签: c string recursion

我编写了一个递归函数,它获得了3个字符串,其中两个按字母顺序排序,第三个字符串被分配为将前两个字符串放在第三个字符串中。字母顺序应该保留;例如:

s1="abbcde";
s2="bckj";

所以,

s3="abbbccdekj";

这是main()中第三个字符串的分配:

char *s3 = (char*)malloc(len*sizeof(char));
SS1together(s1,s2,s3);//send to recursive function 3 strings

这是功能:

   void SS1together(char *s1, char*s2, char*s3)
{
if (s1 == NULL || s2 == NULL)
{
    if (s1 == NULL)
    {
        s3[0] = s2[0];
        SS1together(s1, s2 + 1, s3 + 1);

    }
    else
    {
        s3[0] = s1[0];
        SS1together(s1 + 1, s2, s3 + 1);
    }
}
if (s1 != NULL && s2 != NULL)
{
    if (s1[0] <= s2[0])
    {
        s3[0] = s1[0];
        SS1together(s1 + 1, s2, s3 + 1);
    }
    else
    {
        s3[0] = s2[0];
        SS1together(s1 , s2 + 1, s3 + 1);
    }
}
}

它表明问题在于记忆,但我找不到它。

我在主函数中分配了字符串3,还有一个函数可以完美运行,所以我把主要用于全图:

  void main()
{
char *s1[N], *s2[N], *s3[N];//N=30 ,it is define in the top
int ans, len;

printf("Please enter your string  s1 and then string s2\n");
gets(s1);
gets(s2);
len = strlen(s1) + strlen(s2);

if ((CheckS(s1) == 0) || (CheckS(s2) == 0))
    printf("Not sorted\n");
else
{
    char *s3 = (char*)malloc(len*sizeof(char));
    SS1together(s1,s2,s3);
    puts(s3);
    free(s3);
}
_getch();
}

2 个答案:

答案 0 :(得分:0)

您的代码假定当s1NULL时(第一个if),s2不是NULL并且增加s2并且递归电话。

但是当s2字符串小于s1时,s2将首先到达结尾,因此在递归调用中传递s2+1将导致访问超出范围的内存。这在技术上会导致未定义的行为,并且实际上很可能是内存访问冲突导致崩溃。

在递增指针之前,您应该进行更严格的NULL检查 - s1s2s3

答案 1 :(得分:0)

你适度关闭,但还没有完全考虑终止条件。迭代地合并排序数据比递归更容易整堆。

您不会显示len的计算方式(需要strlen(s1) + strlen(s2) + 1),但即使这样做正确,您的代码也会遇到问题。例如,考虑最简单的情况,两个空字符串。第一个if执行,但递归使用超出字符串末尾的s2 + 1,并导致灾难。我认为修复需要的代码类似于:

void SS1together(char *s1, char *s2, char *s3)
{
    if (s1 == NULL || s1[0] == '\0')
    {
        s3[0] = s2[0];
        if (s2[0] != '\0')
            SS1together(s1, s2 + 1, s3 + 1);
    }
    else if (s2 == NULL|| s2[0]=='\0')
    {
        s3[0] = s1[0];
        if (s1[0] != '\0')
            SS1together(s1 + 1, s2, s3 + 1);
    }
    else if (s1[0] <= s2[0])
    {
        s3[0] = s1[0];
        SS1together(s1 + 1, s2, s3 + 1);
    }
    else
    {
        s3[0] = s2[0];
        SS1together(s1, s2 + 1, s3 + 1);
    }
}

警告:未经测试的代码。

迭代替代

void SS1together(char *s1, char *s2, char *s3)
{
    if (s1 == NULL)
        s1 = "";
    if (s2 == NULL)
        s2 = "";
    while (*s1 != '\0' && *s2 != '\0')
    {
        if (s1[0] <= s2[0])
            *s3++ = *s1++;
        else
            *s3++ = *s2++;
    }
    while (s1[0] != '\0')
        *s3++ = *s1++;
    while (s2[0] != '\0')
        *s3++ = *s2++;
    *s3 = '\0';
}

警告:还有未经测试的代码。