将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方

     源自《The C Programming Language》P25 pr1-20:

     编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方。假设

     制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。n应该是变量还是常量呢?

     参考代码:

     

main.c
1 #include <stdio.h>
2
3 #define TABINC 8 //定义每个TABINC(8)个位置会出现一个制表位
4
5 int main()
6 {
7 int c, nb, pos;
8
9 nb = 0; //到遇到制表符时,到达下个制表位需要的空格数
10 pos = 1; //程序在文本行的当前位置
11 while((c = getchar()) != EOF)
12 {
13 if(c == '\t')
14 {
15 nb = TABINC - (pos - 1)%TABINC;
16 while(nb > 0)
17 {
18 putchar(' ');
19 ++pos;
20 --nb;
21 }
22 }
23 else if(c == '\n')
24 {
25 putchar(c);
26 pos = 1;
27 }
28 else
29 {
30 putchar(c);
31 ++pos;
32 }
33 }
34
35 return 0;
36 }

     分析:

      1,  理解题意:本题的目的是将输入的'/t'换成适当数目的空格输出。比如,输入:

                          ab/tcde/tas

                 pos:123456789,(pos为输入字符的位置,a--第一个输入的字符,c--第四个输入的字符)

                 输出:ab    cde         as,(b与c之间是6个空格,e与a之间是5个空格)

                 注:其实在终端输入的字符串和输出的样式是一样的,这里写成ab/tcde/tas,主要是为了直观

                       上好看,在终端输入时是不会出现上述字符串中的/t,因为这类转义字符时不可见,编译器

                       默认地用若干个空格代替/t。

      2,  TABINC:每隔8个位置就会出现一个制表位,pos为程序在文本行中的当前位置,nb为当遇到制表符时,

           程序计算出要到达下一个制表位所需要的空格数

      3,  将读入字符分成三类:'/t','/n',其他。分别进行处理。

posted on 2011-04-22 18:19  将军之盾  阅读(1013)  评论(1编辑  收藏  举报