我编写了一个递归函数,它获得了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();
}
答案 0 :(得分:0)
您的代码假定当s1
为NULL
时(第一个if
),s2
不是NULL
并且增加s2
并且递归电话。
但是当s2
字符串小于s1
时,s2
将首先到达结尾,因此在递归调用中传递s2+1
将导致访问超出范围的内存。这在技术上会导致未定义的行为,并且实际上很可能是内存访问冲突导致崩溃。
在递增指针之前,您应该进行更严格的NULL检查 - s1
,s2
和s3
。
答案 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';
}
警告:还有未经测试的代码。