码农一定是最需要动手实操的行业之一。有一句话叫,好记性不如烂笔头,牵强附会引申到这里,变成看书百遍,不如码字运行一遍。是不是有那么一点味道?哈哈!

这几天看的《C程序设计》,看完每个章节还是觉得没有完全落实,于是老老实实动手把习题做一遍,算是对不踏实内心的一个交待。仔细做下来才发现,习题其实并不是作者行文的简单回顾总结,而是在此基础上另有拔高和引申,如果你错过了,就少学很多东西。废话不多说,下面说一说1-20 detab这个小练习;

题目是这样的:

编写程序detab, 将输入中的制表符替换成适当数目的空格,使空格充满到
下一个制表符终止位的地方。假设制表符终止位的位置是固定的,比如每隔B列就会出现一个
制表符终止位。"应该作为变貴述是符号常量呢?

看了两遍,按理解写出了下面的代码:

 1 #include <stdio.h>
 2
 3 #define TABNUM 4
 4
 5 int main()
 6 {
 7     char text[1000];
 8     char c;
 9     int index = 0;
10
11     while ((c = getchar()) != EOF)
12     {
13         if (c == '\t')
14         {
15             for  (int i = 0; i < TABNUM; ++i)
16             {
17                 text[index] = ' ';
18                 ++index;
19             }
20         }
21         else
22         {
23             text[index] = c;
24             ++index;
25         }
26
27     }
28
29     printf("%s\n", text);
30
31     return 0;
32 }

cc 编译正常,在运行验证时,发现直接用4个空格替换与输入并不吻合,输入时tab能根据实际输入对齐

感觉中间补足的空格数应该有一定规律。于是,上网搜索果然发现tab处理有玄机。比如tab长度是8,从最开始算起,输入不足8个字符,此时按tab,系统会自动把光标跳到第9个字符,接下来的字符从此开始,如果此时再输入9个字符,则系统会将光标定位到第25个字符处,其中的规律可以总结成:

pos = pos + 8 - (pos - 1) % 8

也就是说当光标在pos位置时,输入tab,光标会跳转至pos + 8 - (pos - 1) % 8的位置。

于是,改进后的代码如下:

 1 #include <stdio.h>
 2
 3 #define TABNUM 8
 4
 5 int main()
 6 {
 7     char text[1000];
 8     char c;
 9     int index = 0;
10     int pos = 1;
11     int space_number;
12
13     while ((c = getchar()) != EOF)
14     {
15         if (c == '\t')
16         {
17             space_number = TABNUM - (pos - 1) % TABNUM;
18             while (space_number > 0)
19             {
20                 text[index] = ' ';
21                 ++index;
22                 ++pos;
23                 --space_number;
24             }
25         }
26         else if (c == '\n')
27         {
28             text[index] = c;
29             pos = 1;
30             ++index;
31         }
32         else
33         {
34             text[index] = c;
35             ++index;
36             ++pos;
37         }
38
39     }
40
41     printf("%s\n", text);
42
43     return 0;
44 }

运行验证:

Perfect!符合预期。

最后的总结就是,习题并不只是纯粹用来为书加量增厚的,还是很有实操的必要!重要的话就说这一遍啦。

转载于:https://www.cnblogs.com/ihada/p/4805911.html

C程序设计 习题之1-20 detab相关推荐

  1. c语言顺序结构程序设计第4章答案,第4章顺序结构程序设计习题及答案.doc

    第4章顺序结构程序设计习题及答案 第4章 顺序结构程序设计 4-1 C语言的控制语句有哪些? 答:C语言有九条控制语句: 条件语句:if-else语句. 开关语句:switch语句. 当循环语句:wh ...

  2. C语言在main中输入2个整数ab,2014年计算机等级二级C语言程序设计习题

    无忧考网为大家收集整理了<2014年计算机等级二级C语言程序设计习题>供大家参考,希望对大家有所帮助!!! 一.选择题(每小题1分,共25分) 1.下列程序的输出结果是( ). int a ...

  3. c语言程序设计 银行整存整取,《C语言程序设计习题试题集》.doc

    <C语言程序设计习题试题集>.doc 1.已知银行整存整取存款不同期限的月息利率分别为: 0.315% 期限一年 0.330% 期限二年 0.345% 期限三年 0.375% 期限五年 0 ...

  4. C语言 用传统流程图表示分段函数,C语言程序设计习题答案

    C语言程序设计习题答案 习题一 C语言程序设计概述 一.名词解释 (1)程序P1 (2)程序设计P1 (3)机器语言P1 (4)汇编程序P2 (5)高级语言P2 (6)编译程序P3 (7)解释程序P3 ...

  5. 面向对象程序设计c 语言描述 答案,c面向对象程序设计习题解答全.doc

    c面向对象程序设计习题解答全 <C++面向对象程序设计>习题解答 陈腊梅 目录 TOC \o "1-3" \h \z \u HYPERLINK \l "_To ...

  6. android应用程序设计张思民课后答案,Java语言程序设计习题答案(清华大学出版杜)张思民版...

    Java语言程序设计习题答案(清华大学出版杜)张思民版 更新时间:2017/2/6 12:39:00  浏览量:568  手机版 第1章 Java概述 [1]为什么说Java的运行与计算机硬件平台无关 ...

  7. c语言 李敬兆 课后答案,C语言程序设计习题与实验指导

    本书给出的基础测试和实验指导是编者在多年教学过程所积累资料的基础上,参考了国内外文献和资料,以普通应用型本科高校的程序设计教学为基础,精心选择和设计的.而书中给出的常见错误小结和实验指导中的改错题包含 ...

  8. 杜有福 c语言 第三版,C语言程序设计习题答案 杜有福.doc

    C语言程序设计习题答案 杜有福.doc C语言程序设计习题答案习题一 C语言程序设计概述一.名词解释(1)程序P1 (2)程序设计P1 (3)机器语言P1 (4)汇编程序P2(5)高级语言P2 (6) ...

  9. c语言程序设计编程题库,C语言程序设计习题库.doc

    C语言程序设计习题库 选择练习题 1.C语言中最简单的数据类型包括( B ). A.整型,实型,逻辑型B.整型,实型,字符型 C.整型,字符型,逻辑型D.整型,实型,逻辑型,字符型 2.C语言中,运算 ...

  10. C语言程序顺序结构1交换变量,C语言程序设计 顺序结构程序设计 习题.doc

    C语言程序设计 顺序结构程序设计 习题 一.选择题 1.putchar ( )函数可以向终端输出一个________ A)整型变量表达式值????? B)实型变量值 C)字符串???????????? ...

最新文章

  1. spring Java相对路径/绝对路径总结
  2. 一个妹子的大厂后台面试经验总结
  3. STM32常用数据类型 u8、u16、u32
  4. pyinstaller 打包
  5. activiti 设置可选处理人_新品速递|高端系列!慧明DF系列线性相位处理专业音箱处理器...
  6. leafLet入门教程兼leafLet API中文文档参考
  7. 自定义控件添加属性_|AutoCAD LT 2019 Mac自定义功能区的方法
  8. 连连看外挂消去算法分析
  9. Mysql学习总结(50)——Oracle,mysql和SQL Server的区别
  10. 票据的生命周期与人的灵魂
  11. android aar项目_一文了解Android游戏SDK开发
  12. 大疆aeb连拍_大疆 AIR2 玩机(一)包围曝光及后期处理
  13. Go语言核心之美 4.1-函数声明
  14. 一款简单好用的动画/游戏制作软件|源码编辑器|编程猫南宁体验中心
  15. 仿QQ局域网聊天软件
  16. 互联网卫星地图服务比较
  17. python 文件题目练习
  18. 小程序获取用户的openid(详解)
  19. 杀毒软件简介:杀毒软件原理,教你如何选择一个好的杀毒软件
  20. MovieClip序列帧动画 视频教程

热门文章

  1. 程序人生:化解互联网 “寒冬” 危机,我教你摆脱困境
  2. java 查询的结果为 0e-8 和 0E-12
  3. 怎么备份分区表?还原备份表怎么操作?
  4. GO学习 ---转义字符
  5. 阿里人脸识别安全技术获专利可防范3D人脸面具攻击
  6. Sencha-组件-Chart(图表)(官网文档翻译17)
  7. JAVA 的++y(--y)和y++(y--) 用法
  8. matlab采用向量作为标号赋值的实质是同维矩阵的赋值
  9. Elasticsearch:Elasticsearch 中的 refresh 和 flush 操作指南
  10. obsidian之腾讯云图床+picgo设置指南