C程序设计 习题之1-20 detab

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

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

题目是这样的:code

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

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

 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能根据实际输入对齐io

感受中间补足的空格数应该有必定规律。因而,上网搜索果真发现tab处理有玄机。好比tab长度是8,从最开始算起,输入不足8个字符,此时按tab,系统会自动把光标跳到第9个字符,接下来的字符今后开始,若是此时再输入9个字符,则系统会将光标定位到第25个字符处,其中的规律能够总结成:编译

pos = pos + 8 - (pos - 1) % 8程序设计

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

因而,改进后的代码以下:基础

 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!符合预期。

 

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

相关文章
相关标签/搜索