免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2271 | 回复: 3
打印 上一主题 下一主题

[C] [已理解]C程序设计语言K&R习题1—21请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-09 11:03 |只看该作者 |倒序浏览
原题是说用最少的TAB和空格来替换空格串,但要保持单词间的距离。

习题解答给出的答案如下:
#include <stdio.h>

#define TABINC 8

main()
{
&nbsp;&nbsp;&nbsp;&nbsp;int c, nb, nt, pos;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;nb = 0;
&nbsp;&nbsp;&nbsp;&nbsp;nt = 0;
&nbsp;&nbsp;&nbsp;&nbsp;for (pos = 1; (c = getchar()) != EOF; ++pos)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (c == ' ') {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (pos % TABINC != 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++nb;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nb = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++nt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ( ; nt > 0; -- nt)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar('\t');
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (c == '\t')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nb = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ( ; nb > 0; --nb)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar(' ');
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar(c);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (c == '\n')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (c == '\t')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos = pos + (TABINC - (pos-1) % TABINC) -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
}


感觉和我想的出入很大,特别是这里:
for (pos = 1; (c = getchar()) != EOF; ++pos)
        if (c == ' ') {
            if (pos % TABINC != 0)
                ++nb;
            else {
                nb = 0;
                ++nt;
用pos的位置MOD TABINC(8)来确定TAB的数量,如果是这样的一个串"aaa     a",即3个非空格,5个空格,1个非空格。那么在pos到达最后一个空格时pos = 8, 按这个算法将得到 pos % TABINC = 0, 于是用一个'\t'来替换所有空格,可此处只有5个空格,达不到8个空格的TAB要求啊?这样替换后不是不能保持单词间的距离了么?
是我想错了,还是哪里没有理解清楚?
希望大家帮忙。

[ 本帖最后由 niexinnm 于 2008-9-9 18:17 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-09-09 18:17 |只看该作者

回复 #1 niexinnm 的帖子

已经理解了此题,是我自己对TAB理解出错了。
因为我们这个时代很少有用TAB来制表了,所以就不是很明白TAB的原理,于是想成了无论几个字符后只要按一个TAB都是后退8个空格。其实TAB是固定位置的,也就是从此行开始,按一次8个空格,再一次又8个空格,中间不管有几个字符都是一样的位置。
希望有同样疑问的同学能看明白,不要再犯同样的错误。

论坛徽章:
0
3 [报告]
发表于 2008-09-09 18:26 |只看该作者
原帖由 niexinnm 于 2008-9-9 18:17 发表
已经理解了此题,是我自己对TAB理解出错了。
因为我们这个时代很少有用TAB来制表了,所以就不是很明白TAB的原理,于是想成了无论几个字符后只要按一个TAB都是后退8个空格。其实TAB是固定位置的,也就是从此行开 ...

。。。用\t 分割字符串很常见,在编程过程中用\t 对齐大量的#define数据也是很常见的

论坛徽章:
0
4 [报告]
发表于 2008-09-09 19:17 |只看该作者
我说的是TAB原本的用途,也就是在DOS时代的制表用法。
虽然我用过DOS,但那时候还很小,没真正用TAB来制表过。
现在用TAB一般都是为了对齐,而不是为了制表的。所以才让我误以为按一次TAB就从当前位置后退8个空格……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP