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

C语言输入输出效率优化

scanf 和 printf 作为C语言的标准输入输出函数,为了提高效率,也是有优化的空间的

注意,本页面中介绍的读入和输出优化均针对整型数据,若要支持其他类型的数据(如浮点数),可自行按照本页面介绍的优化原理来编写代码。

输入优化:

我们都知道,getchar 是用来读入一个字符的数据并将其转换为 char 类型的函数,且速度很快,故可以用“读入字符-转换为整型”来代替缓慢的读入

每个整数由两部分组成——符号和数字

整数的 '+' 通常是省略的,且不会对后面数字所代表的值产生影响,而 '-' 不可省略,因此要进行判定

10 进制整数中是不含空格或除 0~9 和正负号外的其他字符的,因此在读入不应存在于整数中的字符(通常为空格)时,就可以判定已经读入结束

C 和 C++ 语言分别在 ctype.h 和 cctype 头文件中,提供了函数 isdigit, 这个函数会检查传入的参数是否为十进制数字字符,是则返回 true,否则返回 false。对应的,在下面的代码中,可以使用 isdigit(ch) 代替 ch >= '0' && ch <= '9',而可以使用 !isdigit(ch) 代替 ch <'0' || ch> '9'

代码实现:

int read() {int x = 0, w = 1;char ch = 0;while (ch < '0' || ch > '9') // ch 不是数字时{  if (ch == '-') w = -1;        // 判断是否为负ch = getchar();               // 继续读入}while (ch >= '0' && ch <= '9') // ch 是数字时{  x = x * 10 + (ch - '0');  // 将新读入的数字’加’在 x 的后面// x 是 int 类型,char 类型的 ch 和 ’0’ 会被自动转为其对应的// ASCII 码,相当于将 ch 转化为对应数字// 此处也可以使用 (x<<3)+(x<<1) 的写法来代替 x*10ch = getchar();  // 继续读入}return x * w

输出优化:

同样,putchar 是用来输出单个字符的函数,因此将数字的每一位转化为字符输出以加速。要注意的是,负号要单独判断输出,并且每次 %(mod)取出的是数字末位,因此要倒序输出

代码实现:

int write(int x) {if (x < 0) {  // 判负 + 输出负号 + 变原数为正数x = -x;putchar('-');}if (x > 9) write(x / 10);  // 递归,将除最后一位外的其他部分放到递归中输出putchar(x % 10 + '0');  // 已经输出(递归)完 x 末位前的所有数字,输出末位
}

 但是递归实现常数是较大的,我们可以写一个栈来实现这个过程

int write(int x) 
{static int sta[35];int top = 0;do {sta[top++] = x % 10, x /= 10;} while (x);while (top) putchar(sta[--top] + 48);  // 48 是 '0'
}

http://www.mrgr.cn/news/58939.html

相关文章:

  • 在 Ubuntu 上安装 OpenCV 3.2.0 的详细指南
  • react项目因eslint检测未通过而Failed to compile编译失败
  • linux网络编程5——Posix API和网络协议栈,使用TCP实现P2P通信
  • 若依 spring boot +vue3 前后端分离
  • JS轮播图实现自动轮播、悬浮停止轮播、点击切换,下方指示器与图片联动效果
  • 面试题框架篇
  • layui表格反选功能
  • uniapp:上拉加载更多、下拉刷新、页面滚动到指定位置
  • 力扣33:搜索旋转排序数组
  • 从Docker容器中备份整个PostgreSQL
  • 软考系统分析师知识点二三:错题集1-10
  • 并联谐振回路
  • 无人机原理是什么?
  • Linux下的线程同步与死锁避免
  • 从0到1构建 UniApp + Vue3 + TypeScript 移动端跨平台开源脚手架
  • 第15课 算法(上)
  • 快速入门!低功耗4G模组跟服务器之间的加密通信,千万不能错过!
  • 计算机强校99+分《数据库》课设
  • Web开发者必看:TypeScript的进阶用法与最佳实践
  • 动态规划 —— 0-1背包问题
  • vue开发的时候,目录名、文件名、函数名、变量名、数据库字段等命名规范
  • C++11中的同步互斥机制详解
  • 04 P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G
  • P1781 宇宙总统
  • MYSQL-查看创建的用户语法(十一)
  • 代码随想录算法训练营第二十七天 | 122.买卖股票的最佳时机Ⅱ 55.跳跃游戏 45.跳跃游戏Ⅱ 1005.K次取反后最大化的数组和