#include <stdio.h>
#define TABINC 8 //定义每个TABINC(8)个位置会出现一个制表位
int main()
{
int c, nb, pos;
nb = 0; //到遇到制表符时,到达下个制表位需要的空格数
pos = 1; //程序在文本行的当前位置
while((c = getchar()) != EOF)
{
if(c == '/t')
{
nb = TABINC - (pos - 1)%TABINC;
while(nb > 0)
{
putchar(' ');
++pos;
--nb;
}
}
else if(c == '/n')
{
putchar(c);
pos = 1;
}
else
{
putchar(c);
++pos;
}
}
return 0;
}
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',其他。分别进行处理。
nb = TABINC - (pos - 1) % TABINC ;
while (nb > 0){
putchar (' ');
++ pos;
- - nb;
说一下这段代码,对于制表符来讲,如果用过的话你会发现,一个制表符在某些编辑软件里占8个字符的位置,而且制表符所在的位置都是八的整数倍,比如你输入123,此时光标在第四个位置。当在输入制表符的时候光标会停留在啊这一行的第九个位置上,也就是跳出了五个空格,如果你输入的是1234567890,光标在第11个位置上,再输入制表符,光标会停留在这个行第十七个位置上,即跳出了六个空格。(8的倍数)
TABINC - (pos - 1) % TABINC ;
tabinc就是制表符的宽度,设为8.pos是光标在这一行的位置,(pos-1)是上一个字符的位置。再和TABINC 求余是找到这一行中,最后几个不是8的整数倍内的字符个数,用TABINC-这几个字符就得到了应该填充空格的个数