#include<stdio.h>
#include<string.h>
int main()
{
char a[10][10];
char (*p)[10];
void turn(char(*p)[10]);
int i;
printf("输入10个字符串\n");
for(i=0;i<10;i++)
{
gets(a[i]);
}
p=a;
turn(p);
return 0;
}
void turn(char(p)[10])
{
int i,j,k;
char t[10];
for(j=0;j<9;j++)
{
for(i=0;i<9-j;i++)
{
if(strlen(*(p+i))>strlen((p+i+1)))
{
strcpy(t,(p+i));
strcpy((p+i),(p+i+1));
strcpy((p+i+1),t);
}
}
}
for(k=0;k<10;k++)
{
puts(p[k]);
}
}
问题一:字符串缓冲太小了,只有10,一共就有10个字符串,每个字符串长度都要不一样,那么至少有一个字符串的长度为10,加末尾的\0,所以总有一个字符串的实际长度大于10,所以如果缓冲区大小只有10是会越界的。可以定义一个MAX_STRLEN,把缓冲区大小设置为100应该就够了。
问题二:函数定义里面的参数类型错了,少了个*,应该改成:
void turn(char(*p)[MAX_STRLEN])
问题三:比较长度时漏了个*,应该改成:
if (strlen(*(p + i)) > strlen(*(p + i + 1)))
全部代码:
#include<stdio.h>
#include<string.h>
#define MAX_STRLEN 100
int main()
{
char a[10][MAX_STRLEN];
char(*p)[MAX_STRLEN];
void turn(char(*p)[MAX_STRLEN]);
int i;
printf("输入10个字符串\n");
for (i = 0; i < 10; i++)
{
gets(a[i]);
}
p = a;
turn(p);
return 0;
}
void turn(char(*p)[MAX_STRLEN])
{
int i, j, k;
char t[MAX_STRLEN];
for (j = 0; j < 9; j++)
{
for (i = 0; i < 9 - j; i++)
{
if (strlen(*(p + i)) > strlen(*(p + i + 1)))
{
strcpy(t, (p + i));
strcpy((p + i), (p + i + 1));
strcpy((p + i + 1), t);
}
}
}
for (k = 0; k < 10; k++)
{
puts(p[k]);
}
}