将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方
源自《The C Programming Language》P25 pr1-20:
编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方。假设
制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。n应该是变量还是常量呢?
参考代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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',其他。分别进行处理。