您的位置:首页 > 其它

The C Programming Language 练习题1-21

2017-09-21 23:17 357 查看
练习 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: