《C语言入门经典》习题7.2(仅供与某人讨论使用)

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值