C语言:读入三个字符串并按顺序排序,然后将排好序的结果保存到文件中

此程序是一个简单的文件读写和排序的实现,主要功能是读入三个字符串并按顺序排序,然后将排好序的结果保存到文件中。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	FILE * fp;//定制访问文件的指针变量 
	char str[3][10],temp[10];//二维数组 
	int i,j,k,n=3;
	printf("Enter string:\n");
	for(i=0;i<n;i++)
	{
		gets(str[i]);//输入字符串 把二维数组当做3个一维数组,然后进行赋值。 
	}
	for(i=0;i<n-1;i++)
	{
		k=i;
		for(j=i+1;j<n;j++)
		{
			if(strcmp(str[k],str[j])>0)k=j;//比较str[k]和str[j]中字符是否相同 不同则大于0 
			if(k!=i)
			{
				strcpy(temp,str[i]);
				strcpy(str[i],str[k]);
				strcpy(str[k],temp);
				
			}
		}
		
	}
	if((fp=fopen("D:\\Users\\缙云氏\\Desktop\\C\\file.txt","w")) ==NULL)
	{
		printf("can not open file!\n");
		exit(0);
	}
	printf("\nThe new sequence:\n");
	for(i=0;i<n;i++)
	{
		fputs(str[i],fp);fputs("\n",fp);
		printf("%s\n",str[i]);
	}
	return 0;
	
	
	
	
	
 } 

程序主要由以下几个部分组成:

  1. 头文件包含

程序引入了 stdio.h、stdlib.h等头文件,这些头文件中都包含了一些 I/O 和一些语言库函数。

  1. 定义主函数和变量

程序中定义了主函数 main() 和一组变量,其中最重要的是定义二维字符数组 str,提供存储用户输入的三个字符串的缓冲区。

  1. 读入三个字符串

通过循环,程序读入三个字符串并分别存入 str 缓冲区中,使用 gets 函数获取用户输入的各种字符串。这里需要注意,gets 函数已经被废弃,应该使用更安全的 fgets 函数进行替换。

  1. 通过选择排序算法对字符串进行排序

对于本程序来说,本节的内容是重中之重。本程序使用了选择排序算法对输入的字符串按字典序进行排序。

具体的实现方法为:

  • 第1个循环变量 i 从 0 开始循环,循环到 n-2 的位置。
  • 第2个循环变量 j 从 i+1 开始循环,循环到 n-2 的位置。
  • 通过比较数组中下标为 k 的字符串和下标为 j 的字符串,更新 k 的值为数字较小的下标,即所谓的选择排序。
  • 如果 k 不等于 i,则需要进行字符串交换。这时,程序定义一个临时字符串 temp 用于暂存 k 的值,再将 k 处的字符串值赋给 i 处的字符串,最后将 temp 中的值赋给 k 处的字符串,实现字符串值的交换。

需要注意的是,本程序使用 strcpy 函数进行字符串交换,为了避免内存泄漏或内存溢出的情况出现,需要确保拷贝的目标字符串已经开辟好了足够多的存储空间。

  1. 将结果保存到文件中

本程序将排好序的结果一行一行地输出到控制台的屏幕上,并且通过 fopen 函数打开一个文件。如果打开文件失败,程序将返回错误信息并退出。如果打开文件成功,则程序将所有字符串写入文件中,最后关闭文件和程序。需要注意的是,本程序使用 fputs 函数来逐行输出字符串,以保证每个字符串占用单独的一行。

总结:

这个程序是一个简单的文件读写和选择排序的实现,主要目的是向学习者展示如何使用 C 语言进行文件的读写和字符串的基本操作。程序的设计体现了 C 语言基础中的常量、控制流结构、数组和指针等基本概念,同时展现了实际应用中需要注意的问题,如内存需要清理和检查输入等重要方面。

当然,本程序只是一个简化的版本,缺乏足够的错处理和面向对象设计,因此需要更进一步的完善和优化来适应一些更高级的应用场景。
以下是一些可以对该程序进行完善的建议,以便更好地适应于更高级、更复杂的应用场景:

  1. 输入合法性验证

当前程序只是简单地使用 gets 函数获取用户输入的字符串,而没有进行任何输入合法性验证,这可能导致输入非法字符时程序崩溃或者运行出现不确定的结果。因此,可以添加一些输入合法性验证的代码,诸如输入是否合法、输入长度的判断、输入的字符集等等。

  1. 错误处理与告警机制

该程序中并没有对错误情况进行足够的处理,比如打开文件失败、内存分配错误等等。应该加入适当的错误处理和告警机制来提高程序的容错能力。比如,可以在遇到错误时输出相应的错误信息、记录日志或者保存程序运行状态等信息。

  1. 改进排序算法

当前程序中采用了选择排序算法来对字符串进行排序,该算法的时间复杂度为 O(n²)。对于较大的数据集,选择排序算法的效率会很低,可以考虑改进排序算法,例如归并排序、快速排序或者堆排序等算法。

  1. 对文件读写进行封装

文件读写是一项常见操作,可以将文件读写的功能封装成一个独立的单元,避免在各处都写类似的代码,提高程序的可维护性和可扩展性。

  1. 重构程序

可以将程序进行重构,将各个功能拆分成函数来实现,以提高可读性和代码复用性。比如可以将排序功能抽象成一个单独的函数,并将错误处理和告警机制的功能进行封装。同时,可以使用面向对象的编程方式,将程序进行设计和重构,以提高程序的可维护性和可拓展性。

总之,该程序还有很多可以改进的地方,这也是程序开发和优化的一般过程。通过完善和重构程序,可以提高程序的性能、可复用性和可维护性,也可以提高程序员的编程能力和经验。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯烟火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值