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

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

题目是这样的:

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

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

 #include <stdio.h>

 #define TABNUM 4

 int main()
{
char text[];
char c;
int index = ; while ((c = getchar()) != EOF)
{
if (c == '\t')
{
for (int i = ; i < TABNUM; ++i)
{
text[index] = ' ';
++index;
}
}
else
{
text[index] = c;
++index;
} } printf("%s\n", text); return ;
}

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

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

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

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

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

 #include <stdio.h>

 #define TABNUM 8

 int main()
{
char text[];
char c;
int index = ;
int pos = ;
int space_number; while ((c = getchar()) != EOF)
{
if (c == '\t')
{
space_number = TABNUM - (pos - ) % TABNUM;
while (space_number > )
{
text[index] = ' ';
++index;
++pos;
--space_number;
}
}
else if (c == '\n')
{
text[index] = c;
pos = ;
++index;
}
else
{
text[index] = c;
++index;
++pos;
} } printf("%s\n", text); return ;
}

运行验证:

Perfect!符合预期。

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

C程序设计 习题之1-20 detab的更多相关文章

  1. Java程序设计当堂测试 9.20

    /*Java当堂测试 ATM机模拟系统由于学习的知识有限,不能完成所有课上项目,文件的应用没有完成,汇款转账功能也没有写,一些要求该退出的地方也没有写,基本功能还算完善*/ 1 package acc ...

  2. java程序设计习题总结

    ---恢复内容开始--- main()方法的参数名可以改变:main()方法的参数个数不可以改变. 当一个程序没有main()方法是,是可以编译通过的,但是不能给运行,因为找不到一个主函数入口. 标识 ...

  3. 你好,C++(31)我终于找到对象啦!6.1 从结构化设计到面向对象程序设计

    第6章 当C++爱上面向对象 很多第一次进入C++世界的人都会问:C++中的那两个加号到底是什么意思啊? C++是由C语言发展而来的,它比C语言多出的两个加号,实际上是C语言的自增操作符,表示C++语 ...

  4. 算法(第四版)C# 习题题解——1.3

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 这一节内容可能会用到的库文件有 ...

  5. Java编程兵书

    <Java编程兵书> 基本信息 作者: 桂颖 任昱衡 丛书名: 程序员藏经阁 出版社:电子工业出版社 ISBN:9787121207419 上架时间:2013-8-26 出版日期:2013 ...

  6. 第一次写C语言小程序,可以初步理解学生成绩管理系统的概念

    1 成绩管理系统概述 1.1  管理信息系统的概念  管理信息系统(Management Information Systems,简称MIS),是一个不断发展的新型学科,MIS的定义随着科技的进步也在 ...

  7. 08C++函数

    函数 4.1 概述 一个较大的程序不可能完全由一个人从头至尾地完成,更不可能把所有的内容都放在一个主函数中.为了便于规划.组织.编程和调试,一般的做法是把一个大的程序划分为若干个程序模块(即程序文件) ...

  8. linux系统的任务计划crontab使用详解

    linux系统的任务计划crontab使用详解 其实大部分系统管理工作都是通过定期自动执行某一个脚本来完成的,那么如何定期执行某一个脚本呢?这就要借助linux的cron功能了. 关于cron任务计划 ...

  9. Python 之 【markdown 模块的学习】

    摘要: markdown工具,可以将txt转化成html格式.这一类工具的作用是将按一定格式写成的可读性强的文本文件转化为结构化的标准xhtml或html.Linux 下面也有markdown: zh ...

随机推荐

  1. MongoDB入门三步曲3--部署技术:主备、副本集和数据分片

    mongodb部署--主备.副本及数据分片 主备复制 副本集 数据分片 主备复制 主备复制是最基本的一种多点部署方案,在读写分离.热备份.数据恢复等方面具有重要作用. 在真实的生产环境,主备库肯定需要 ...

  2. linux(centos)搭建svn

    1.yum install subversion 2.输入rpm -ql subversion查看安装位置 输入 svn --help可以查看svn的使用方法 3.创建svn版本库目录 mkdir - ...

  3. soso街景开发——在移动应用(网站)中的应用

    腾讯soso街景为用户提供JavaScript API1.0和JavaScript API2.0,可供用户在网站中应用soso街景地图. 街景可以应用于各个方面,如果你需要开发的网站是一款涉及都旅游, ...

  4. VM启动报错:Failed to lock the file

    http://www.cnblogs.com/kristain/articles/2491966.html Reason: Failed to lock the fileGoogle 了一下, 在網路 ...

  5. linux系统管理

    系统 # uname -a               # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue   # 查看操作系统版本# cat /proc/cpuinfo  ...

  6. SQLServer数据库通用访问类

    private static string connString=ConfigurationManager.ConnStrings["connString"].ToString() ...

  7. ExtJS4.2学习(16)制作表单(转)

    鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-12-10/188.html --------------- ...

  8. 用JavaScript探测页面上的广告是否被AdBlock屏蔽了的方法

    每个人都讨厌广告.看电视.看电影.看优酷.看网页时,对满天飞的广告也是深恶痛绝.广告是一个不招人喜欢的东西.但是,对一个中小网站站长/博客主来说,广告几乎是唯一的能成支持网站/博客正常运转的资金来源. ...

  9. [转载]MongoDB的真正性能

    最近开始研究MySQL和MongoDB,发现这方面资料不多.尤其是真正的说到点子上的文章,太少了. 有一些对比测试的文章基本上都是瞎测,测试方法都测到了马腿上,得出的结论基本上都是NoSQL毫无价值 ...

  10. Codeforces Round #230 (Div. 2) C Blocked Points

    题目链接 题意 : 给你一个半径为n的圆,圆里边还有圆上都有很多整点,让你找出与圆外的任意一个整点距离等于1的点. 思路 :这个题可以用枚举,画个图就发现了,比如说先数第一象限的,往下往右找,还可以找 ...