C progaramming language1-21
#define TABINCS 8
int main()
{
int ns, nt;//ns,nt分别表示必要时打印空格和制表符的个数
char c;
int pos = 1;//记录程序在文本行中的位置
ns = 0;
nt = 0;
while ((c = getchar()) != EOF)
{
pos++;//每输入一个字符记录一次位置
//根据本题的要求,主要分为空格符和非空格符
if (c == ' ')//空格符
{
if (pos % TABINCS != 0)//当遇到空格符时,首先记录空格符个数
{
ns++;
}
else//pos变量每递增到TABINCS的整数倍时
{
ns = 0;//重置空格符个数
nt++;//转化为打印一个换行符
}
//这里涉及到只需要一个空格就能到达下一个制表符终止位
//为了避免特殊情况(具体是什么情况还不清楚),这里将空格个数清零,相当于替换成换行符
}
else//遇到非空格符,能打印'\t'就先打印'\t',实在不行再打印空格符
{
for (; nt > 0 ; nt--)//在遇到非空格符时,先将之前积累的换行符打印好
//此时光标在制表符终止位的整数倍位置上()
{
putchar('\t');
}
if (c == '\t')//如果输入的字符是换行符,那么光标依旧在制表符终止位的整数倍位置上,
//那么空格符没必要打印
{
ns = 0;
}
else//如果不是换行符,那么打印空格符是最优选择。如果打印制表符,会改变单词的间隔
{
for (; ns > 0; ns--)
{
putchar(' ');
}
}
putchar(c);
if (c == '\n')
{
pos = 0;//重置位置
}
else if (c == '\t')
{
pos = pos + (TABINCS - (pos - 1) % TABINCS)-1;//更新位置
//(pos - 1) % TABINCS表示的内容取决于(pos - 1)与TABINCS这两者的大小
//(pos - 1)>TABINCS时,它表示上一个制表符终止符和当前位置之间的字符数
//(pos - 1)<TABINCS时,它表示当前制表符终止符和当前位置之间的字符数
}
}
}
}