此程序是一个简单的文件读写和排序的实现,主要功能是读入三个字符串并按顺序排序,然后将排好序的结果保存到文件中。
#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;}
程序主要由以下几个部分组成:
- 头文件包含
程序引入了 stdio.h、stdlib.h等头文件,这些头文件中都包含了一些 I/O 和一些语言库函数。
- 定义主函数和变量
程序中定义了主函数 main() 和一组变量,其中最重要的是定义二维字符数组 str,提供存储用户输入的三个字符串的缓冲区。
- 读入三个字符串
通过循环,程序读入三个字符串并分别存入 str 缓冲区中,使用 gets 函数获取用户输入的各种字符串。这里需要注意,gets 函数已经被废弃,应该使用更安全的 fgets 函数进行替换。
- 通过选择排序算法对字符串进行排序
对于本程序来说,本节的内容是重中之重。本程序使用了选择排序算法对输入的字符串按字典序进行排序。
具体的实现方法为:
- 第1个循环变量 i 从 0 开始循环,循环到 n-2 的位置。
- 第2个循环变量 j 从 i+1 开始循环,循环到 n-2 的位置。
- 通过比较数组中下标为 k 的字符串和下标为 j 的字符串,更新 k 的值为数字较小的下标,即所谓的选择排序。
- 如果 k 不等于 i,则需要进行字符串交换。这时,程序定义一个临时字符串 temp 用于暂存 k 的值,再将 k 处的字符串值赋给 i 处的字符串,最后将 temp 中的值赋给 k 处的字符串,实现字符串值的交换。
需要注意的是,本程序使用 strcpy 函数进行字符串交换,为了避免内存泄漏或内存溢出的情况出现,需要确保拷贝的目标字符串已经开辟好了足够多的存储空间。
- 将结果保存到文件中
本程序将排好序的结果一行一行地输出到控制台的屏幕上,并且通过 fopen 函数打开一个文件。如果打开文件失败,程序将返回错误信息并退出。如果打开文件成功,则程序将所有字符串写入文件中,最后关闭文件和程序。需要注意的是,本程序使用 fputs 函数来逐行输出字符串,以保证每个字符串占用单独的一行。
总结:
这个程序是一个简单的文件读写和选择排序的实现,主要目的是向学习者展示如何使用 C 语言进行文件的读写和字符串的基本操作。程序的设计体现了 C 语言基础中的常量、控制流结构、数组和指针等基本概念,同时展现了实际应用中需要注意的问题,如内存需要清理和检查输入等重要方面。
当然,本程序只是一个简化的版本,缺乏足够的错处理和面向对象设计,因此需要更进一步的完善和优化来适应一些更高级的应用场景。
以下是一些可以对该程序进行完善的建议,以便更好地适应于更高级、更复杂的应用场景:
- 输入合法性验证
当前程序只是简单地使用 gets 函数获取用户输入的字符串,而没有进行任何输入合法性验证,这可能导致输入非法字符时程序崩溃或者运行出现不确定的结果。因此,可以添加一些输入合法性验证的代码,诸如输入是否合法、输入长度的判断、输入的字符集等等。
- 错误处理与告警机制
该程序中并没有对错误情况进行足够的处理,比如打开文件失败、内存分配错误等等。应该加入适当的错误处理和告警机制来提高程序的容错能力。比如,可以在遇到错误时输出相应的错误信息、记录日志或者保存程序运行状态等信息。
- 改进排序算法
当前程序中采用了选择排序算法来对字符串进行排序,该算法的时间复杂度为 O(n²)。对于较大的数据集,选择排序算法的效率会很低,可以考虑改进排序算法,例如归并排序、快速排序或者堆排序等算法。
- 对文件读写进行封装
文件读写是一项常见操作,可以将文件读写的功能封装成一个独立的单元,避免在各处都写类似的代码,提高程序的可维护性和可扩展性。
- 重构程序
可以将程序进行重构,将各个功能拆分成函数来实现,以提高可读性和代码复用性。比如可以将排序功能抽象成一个单独的函数,并将错误处理和告警机制的功能进行封装。同时,可以使用面向对象的编程方式,将程序进行设计和重构,以提高程序的可维护性和可拓展性。
总之,该程序还有很多可以改进的地方,这也是程序开发和优化的一般过程。通过完善和重构程序,可以提高程序的性能、可复用性和可维护性,也可以提高程序员的编程能力和经验。