所以我为家庭作业编写了这段代码。它的作用是接收n个字符串,一个规则编号,然后打印根据该规则编号排序的字符串:1表示字典顺序,2表示按字母多样性排序。我的问题是,尽管字符串仍在有效长度内,但当输入较大时会崩溃。
我的主要功能是比较和排序。
int CompareStrings(char* str1, char* str2, int rule)
{
if(rule==LEX )
{
int n=strlen(str1);
int m=strlen(str2);
char* tmp1=(char*)malloc(sizeof(char)*(n+1));
char* tmp2=(char*)malloc(sizeof(char)*(m+1));
for(int i=0; i<n; i++)
{
tmp1[i]=make_lower(str1[i]);
}
for(int i=0; i<m; i++)
{
tmp2[i]=make_lower(str2[i]);
}
int result=strcmp(tmp1,tmp2);
return result;
free(tmp1);
free(tmp2);
}
else
{
int x,y,c=0,i=0,count[26] = {0}, count2[26] = {0},m=0,n=0;
while (str1[c] != '\0')
{
if (make_lower(str1[c]) >= 'a' && make_lower(str1[c]) <= 'z')
{
x = str1[c] - 'a';
count[x]++;
}
c++;
}
for (c = 0; c < 26; c++)
{
if(count[c]!=0)
n++;
}
while (str2[i] != '\0')
{
if (make_lower(str2[i]) >= 'a' && make_lower(str2[i]) <= 'z')
{
y = str2[i] - 'a';
count2[y]++;
}
i++;
}
for (i = 0; i < 26; i++)
{
if(count2[i]!=0)
m++;
}
return n-m;
}
}
int bubble(char* a[], int n,int rule)
{
int i, swapped = 0;
for (i = 1; i < n; ++i)
if (CompareStrings(a[i],a[i-1], rule)<0)
{
swap(a[i], a[i-1]);
swapped = 1;
}
return swapped;
}
void SortStrings(char* str_arr[], int n, int rule)
{
int not_sorted = 1;
while ((n > 1) && not_sorted )
not_sorted = bubble(str_arr, n--,rule);
}
它崩溃的输入例如是: 5个字符串
-abcdefghijklmnopqrstuvwxyz
-abcdefghijklmnopqrstuvwxy
-abcdefghijklmnopqrstuvwx
-abcdefghijklmnopqrstuvw
-abcdefghijklmnopqrstuv
和规则2(字母的多样性)
哦,MAX_LEN设置为30
答案 0 :(得分:0)
此:
int n=strlen(str1);
int m=strlen(str2);
char* tmp1=(char*)malloc(sizeof(char)*(n+1));
char* tmp2=(char*)malloc(sizeof(char)*(m+1));
for(int i=0; i<n; i++)
{
tmp1[i]=make_lower(str1[i]);
}
for(int i=0; i<m; i++)
{
tmp2[i]=make_lower(str2[i]);
}
int result=strcmp(tmp1,tmp2);
return result;
free(tmp1);
free(tmp2);
损坏,副本不终止。在未终止的字符串上调用strcmp()
是崩溃的一种好方法。
此外,代码也存在一些问题:
n
和m
应该是const
。char *tmp1 = malloc(n + 1);
,不能进行强制转换,也不能按sizeof (char)
进行缩放,这毫无意义。result
也应该是const
。free()
调用移至return
之前,否则它们将永远不会执行。