The C Programming Language 练习题1-21

练习 1-21

编写程序 entab,将空格串替换为最少数量的制表符和空格,但要保持单词之间的间隔不变。假设制表符终止位的位置与练习1-20 的detab程序的情况相同。当使用一个制表符或者一个空格都可以到达下一个制表符终止位时,选用哪一种替换字符比较好?

题目分析
此习题要求将字符串中的空格键替换为最少的制表符和空格的组合,Windows默认制表符占8个字符空间,例如有15个空格,那么要用2个制表符和1个空格来代替。

编程思路
1.逐字判断输入字符是否空格,如果不是就直接输出。
2.如果出现空格,就给空格计数加1,再返回读取。
如果不是空格,判断空格数是否大于0,然后计算输出几个制表符和几个空格并输出,输出完之后将空格计数清零并将最近读到的这个非空格字符输出。
如果不是空格,判断是否换行,如果是换行则将空格数目清零;
如果都不是,则直接输出字符。
3.继续判断。

程序实现部分

int main()
{
int spacenum;   /*输入字符串中每段空格数量*/
int tabnumfinal;     /* 替换后所需制表符个数 */
int spacenumfinal;  /* 替换后所需空格个数 */
char c;

spacenum = tabnumfinal = spacenumfinal = 0;
while ((c = getchar()) != EOF)
{
    /* 如果输入空格,就给spacenum加1 */
    if ( c == ' ') spacenum++;
     /* 如果输入不是空格,并且spacenum大于0,计算替换这一段的空格数所需的
        制表符和空格个数,并且输出 */
    else if ( spacenum > 0 )
        {
        tabnumfinal = ( spacenum / DEFAULTTABNUM );
        spacenumfinal = ( spacenum % DEFAULTTABNUM );
        while (tabnumfinal > 0)
            {
            putchar('\t');
            tabnumfinal--;
            }
        while (spacenumfinal > 0)
            {
            putchar(' ');
            spacenumfinal--;
            }
        spacenum = 0;
        putchar(c);
        }
    /* 如果输入换行将spacenum清零 */
    else if ( c == '\n') spacenum = 0;
    /* 如果既没有输入空格,空格计数=0,也不是换行,直接输出字符 */
    else putchar(c);
}
return 0;

}

运行结果

输入:aaaa    bcd        efgh         abcdef                 ghijklmn
输出:aaaa    bcd     efgh     abcdef          ghijklmn

好奇怪,将代码中‘\t’替换为字母t,‘ ’替换为*,发现制表符和空格数目计算没错,但输出偏偏不正确,仍然不知道问题出在哪,摸索中。。。

输入:aaaa    bcd        efgh         abcdef                 ghijklmn
输出:aaaa****bcdtefght*abcdeftt*ghijklmn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值