C语言学习第十天,今天主要是做昨天后面留的练习题,习题难度比较大,基本一个题得1~2个小时做,明天继续做。
#include
#define TABNUM 8
/*练习1-21 编写程序entab,将空格串替换为最少来嗯的制表符和空格,但要保持单词之间的间隔不变。假设制表符终止位的位置与练习1-20的detab程序的情况相同。当使用一个制表符或者一个空格都可以达到下一个制表符终止位时,选用哪一种替换字符比较好?*/
main() {
int c, pos, i, nspace, temp; /* 输入的字符、用于记录每一个8位(tab数)输入当前到第几位了、nspace用于记录一个8位连续空格数目*/
i = pos = nspace = temp = 0;
while ((c = getchar()) != EOF) {
if (c == ' ') { /* 空格时记录空格数目 */
++nspace;
} else {
if (nspace > 0) { /* 在一串空格后 */
temp = nspace + pos; /* 先看之前输入的字符数+空格数的个数 */
if (temp < 8) { /* 如果个数小于8, 说明还没有到达制表发的标准,原样出空格即可*/
for(i = 0; i < nspace; i++)
putchar(' ');
} else { /* 如果大于等于8, 说明已经至少可以数出一个制表符了,*/
/* 每一个制表符可以填充到8位, 每次填充一个制表符后减去8位,直到剩下的字符数量不够8位,就原样数出空格即可*/
while ((temp - 8) >= 0) {
putchar('\t');
temp = temp - 8;
}
for(i = 0; i < temp; i++)
putchar(' ');
}
pos = temp; /* 空格和制表符输出之后,还剩下的字符作为下一次替换前的输入个数记录*/
nspace = 0; /* 空格输出完毕后,把空格数清零*/
}
putchar(c); /* 替换或者不替换,都把这次的字符原样输出*/
++pos; /*输入个数+1*/
if (pos >= 8) /*如果连续的输入达到了一个制表符还没被替换过,就把输入数赋值成除以8的余数*/
pos = pos % 8;
if( c == '\n') /*换行后一切重新开始,输入数清空, 空格已经在上面清空了*/
pos = 0;
}
}
}
上一篇:kubctl--编辑中