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

news/2024/11/23 0:19:46/

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

#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. 重构程序

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

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


http://www.ppmy.cn/news/102640.html

相关文章

【Python】一个房贷计算器功能的小案例

题目要求&#xff1a; 房贷计算公式如下: 〉每月月供参考贷款金额[月利率(1&#xff0b;月利率)^还款月数]{[(1月利率)^还款月数]–1}>还款总额每月月供参考期限 12 ≥支付利息还款总额–贷款金额10000 以上计算方式中月利率(月利率利率12&#xff09;)指以月为计息周期计算…

【华为OD统一考试B卷 | 100分】执行时长(C++ Java JavaScript Python)

文章目录 题目描述输入描述输出描述ACM输入输出模式用例机考代码查重C++javascriptjavapython题目描述 为了充分发挥GPU[算力],需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。 假设GPU最多一次执行n个任务,…

addr2line 使用,定位kernel panic 代码位置

在kernel崩溃时&#xff0c;方便定位代码。 需要打开kernel配置CONFIG_DEBUG_INFO。 需要有System.map和vmlinux文件&#xff0c;一般在out目录。 一般panic的时候会有给出panic的指针&#xff0c;如下down_write。 el1_data说明发生异常了&#xff0c;进入和entry.S文件&a…

NFTScan | 05.22~05.28 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.05.22 ~ 2023.05.28 NFT Hot News&#xff1a;NFT 热点资讯 01/ 数据&#xff1a;24 小时内两巨鲸共抛售 349 枚 MAYC NFT 5 月 22 日&#xff0c;Debank 数据显示&#xff0c;近 …

开源2.4g遥控小飞机控制板

原理图 主控 6轴IMU 2.4G通信 电机驱动 特性 主控采用STM32F103CBT6&#xff0c;外设资源比较丰富&#xff0c;国产替代也很容易。红绿双色LED&#xff0c;GPIO控制&#xff0c;可用来提示程序运行状态。1个复位按键&#xff0c;1个用户按键可以用作输入。SWD&UART调试接…

GPT Demo 分享|日不落直播间接入虚拟人AI互动

摘要 虚拟人和数字人是人工智能技术在现实生活中的具体应用&#xff0c;它们可以为人们的生活和工作带来便利和创新。在直播间场景里&#xff0c;虚拟人和数字人可用于直播主播、智能客服、营销推广等。接入GPT的虚拟人像是加了超强buff&#xff0c;具备更强大的自然语言处理能…

常用的数字高程模型(DEM)数据介绍,附免费下载

常用的数字高程模型&#xff08;DEM&#xff09;数据&#xff1a;​ ETOPO&#xff08;1.8千米&#xff09; ETOPO是一种地形高程数据&#xff0c;由NGDC美国地球物理中心发布&#xff0c;与大多数高程数据不同的是&#xff0c;它还包含海底地形数据。 SRTM15&#xff08;450…

视频编辑软件:迅捷视频工具箱

这是一款功能强大、易于使用的视频编辑工具&#xff0c;支持视频剪辑、视频转换、音频转换、视频压缩、视频水印、字幕贴图等实用功能&#xff0c;可以帮助你制作出高质量的视频作品。&#xff08;传送门&#xff1a;https://www.xunjiepdf.com/xjspgjx&#xff09; 功能简介 …