#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char ch = ' ';
int a = 10, q = 10, count = 0, str = 1, i,j;
char **pa = NULL, **pb = NULL, *b = NULL, *Temp = NULL;
//分配二维数组内存
pa = calloc(a, sizeof(char*));
if (!pa)
{
printf("\a警告:内存分配失败!\n");
system("pause");
return 1;
}
//循环读取谚语
do
{
count++;
printf("请输入第%d句谚语:\n", count);
//扩展二维数组内存
if (count >= a)
{
a += 10;
pb = realloc(pa, a*sizeof(char*));
if (!pb)
{
printf("\a警告:内存扩展失败!\n");
free(pa);
pa = NULL;
system("pause");
return 1;
}
pa = pb;
}
//分配子数组内存
*(pa + count - 1) = calloc(q, sizeof(char));
if (!*(pa + count - 1))
{
printf("\a警告:分配内存失败!\n");
for (i = 0; i < count; ++i)
free(*(pa + i));
free(pa);
system("pause");
return 1;
}
ch = ' ';
str = 1;
//读取输入
while (ch != '\n')
{
++str;
ch = getchar();
//拓展子字符串
if (str >= q)
{
q += 10;
for (i = 0; i < count; ++i)
{
b = realloc(*(pa + i), q*sizeof(char));
if (!b)
{
for (i = 0; i < count; ++i)
free(*(pa + i));
free(pa);
system("pause");
return 1;
}
*(pa + i) = b;
}
}
pa[count - 1][str - 2] = ch;
}
pa[count - 1][str - 1] = '\0';
} while (strcmp(pa[count - 1], "\n") != 0);
Temp = calloc(q, sizeof(char));
if (!Temp)
{
printf("\a警告:内存分配失败!\n");
for (i = 0; i < count; ++i)
free(*(pa + i));
free(pa);
system("pause");
return 1;
}
//排序
if (count > 2)
{
for (j = 0; j <count - 2; ++j)
{
for (i = 0; i < count - 2; ++i)
{
if (strnlen(pa[i], q) > strnlen(pa[i + 1], q))
{
Temp = pa[i + 1];
pa[i + 1] = pa[i];
pa[i] = Temp;
}
}
}
}
//输出
for (i = 0; i < count - 1; ++i)
printf("%s",pa[i]);
//释放内存
for (i = 0; i < count; ++i)
free(pa[i]);
free(pa);
system("pause");
return 0;
}