码农一定是最需要动手实操的行业之一。有一句话叫,好记性不如烂笔头,牵强附会引申到这里,变成看书百遍,不如码字运行一遍。是不是有那么一点味道?哈哈!
这几天看的《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!符合预期。
最后的总结就是,习题并不只是纯粹用来为书加量增厚的,还是很有实操的必要!重要的话就说这一遍啦。