当前位置: 首页 > news >正文

一次C语言实现字符排序出现的问题

作者:柳晛
属性:原创
发表时间:2007-2-2

计划寒假期间编写一套数据加密系统,在翻阅资料时发现一个排序实例是这样做的:

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 #include"stdio.h"
 2 #include"string.h"
 3 void main()
 4 {  char a[20],temp;
 5    int i,j;
 6    gets(a);
 7    for(i=0;i<19;i++)
 8      for(j=i+1;j<20;j++)
 9        if(a[i]>a[j])
10        {  temp=a[i];
11           a[i]=a[j];
12           a[j]=temp;
13        }    
14    puts(a);
15 }
16 

这段C语言代码看似正确,但实际上是无法实现的。我们看它第九行代码“if(a[i]>a[j])”是判断数组a[i]与a[j]的大小,如果a[i]大于a[j]则进行交换。在C语言中,字符串尾部总是有一个结束标记,这个结束标记的值为0。ASCII码使用的都是正整数表示字符,所以0为最小。用到这个程序中来,末尾结束符始终比前面输入的字符小,所以总是会将后面的结束符连同编译器给字符数组初始化的空字符排到前面,而我们输入的字符排在后面。puts()函数遇到空字符就会认为这是结束符,从而停止输出,达不到我们想要的效果;所以这个程序只能使用小于号进行升序排列,不能用大于号进行降序排列。
若此题要改成降序排列,需要检测字符数组实际接受字符的个数,将比较范围锁定在这个数值之中,这样可以有效避免当前下标与后面多余的空字符相比较。而且比较范围缩小,减少冗余计算,提高了程序运行效率。

正确代码应当是:

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 #include"stdio.h"
 2 #include"string.h"
 3 void main()
 4 {  char a[20],temp;
 5    int i,j;
 6    gets(a);
 7    for(i=0;i<strlen(a);i++)
 8      for(j=i+1;j<strlen(a);j++)
 9        if(a[i]>a[j])
10        {  temp=a[i];
11           a[i]=a[j];
12           a[j]=temp;
13        }    
14    puts(a);
15 }

 

相关文章:

  • maven多模块搭建
  • vs2005 调试时出现“无法附加。绑定句柄无效”的解决办法
  • 正在考虑用Scala语言来实现TTCN-3的功能
  • ICMP协议
  • 组建简单的IPv6网络
  • 单点登录 - CAS退出登录后跳转到指定页面
  • Active Directory的脱机碎片整理,Active Directory系列之七
  • UVA 10881 - Piotr's Ants【模拟+思维】
  • PyQt简介
  • Exchange 2016邮箱导入pst状态查看
  • 还原意外删除的用户账户[为企业维护windows server 2008系列三]
  • 关于硬链接与软连接占用磁盘空间问题的分析研究
  • 【BZOJ】1602:[Usaco2008 Oct]牧场行走
  • 密码修改错误,由失落到兴奋……
  • moss和exchange 2007的sso
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • avalon2.2的VM生成过程
  • GraphQL学习过程应该是这样的
  • Javascript 原型链
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Laravel 实践之路: 数据库迁移与数据填充
  • Laravel 中的一个后期静态绑定
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • PaddlePaddle-GitHub的正确打开姿势
  • rc-form之最单纯情况
  • STAR法则
  • vue2.0项目引入element-ui
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 简单数学运算程序(不定期更新)
  • 将 Measurements 和 Units 应用到物理学
  • 免费小说阅读小程序
  • 微信小程序--------语音识别(前端自己也能玩)
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • ###C语言程序设计-----C语言学习(6)#
  • (1)常见O(n^2)排序算法解析
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (二)正点原子I.MX6ULL u-boot移植
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)四层和七层负载均衡的区别
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net mvc 获取url中controller和action
  • .NET 服务 ServiceController