首页
社区
课程
招聘
[旧帖] 一道C语言题目 0.00雪花
发表于: 2010-12-25 18:16 7137

[旧帖] 一道C语言题目 0.00雪花

2010-12-25 18:16
7137
这是"The C Programming Language"中的一道题目我只道IF是判断是否为连续多个空格,如果是多个空格,输出的时候只用一个空格,但我不知道他是怎么用inspace这个变量实现的。请求详解。
#include <stdio.h>

int main(void)
{
  int c;
  int inspace;

  inspace = 0;
  while((c = getchar()) != EOF)
  {
    if(c == ' ')
    {
      if(inspace == 0)
      {
        inspace = 1;
        putchar(c);
      }
    }
  if(c != ' ')
    {
      inspace = 0;
      putchar(c);
    }
  }

  return 0;
}

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
2

不知道你懂了没 呵呵 。。画个图就出来了。。
上传的附件:
2010-12-25 18:34
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
结合楼上的流程图。

while循环,每次读入一个字符c。
  1.如果c不为空格,则设置inspace为0,这样下一次读到空格时可以输出;
  2.如果c为空格,则先判断inspace是否为0,不是则不输出,是则输出空格,设置inspace为1,这样下一次读到空格时就不再输出。
2010-12-25 19:46
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
inspace是判断连续空格的标志,当读到第一个空格时就置inspace为1并输出,后面连续读到的空格因为inspace都为1了就不再输出。
当读到其他字符时,重置inspace标志为0。
2010-12-26 02:06
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
来学习了,实在不会
2010-12-26 04:08
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
是空格,如果是第一个则输出,不是第一个跳过;
不是空格,使inspace为零,输出c
2010-12-26 11:28
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
inspace就好比一个开关,一开始开关打开(inspace==0),当第一次读到空格时,输出这个空格,然后开关关闭(inspace=1),只有读到非空格时开关才打开(inspace=0)
2010-12-27 10:49
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
8
inspace 的目的是标识当前读取的字符是否是空白字符。
2010-12-27 14:55
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
9
个人认为楼上解释的不对,前几位解释的已经很详细了。相信楼主能够明白了吧。inspace实际上就是一个哨兵。
2010-12-27 15:08
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
来学习了,实在帮不了忙!呵呵
2010-12-28 14:13
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
just here to learn.
觉得就是为了限制只输入一个空格,多则不输出吧?
2010-12-28 14:38
0
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
inspace这个变量记录输入“ ”的多少,如果“ ”>=2测inspace变为1并停止输入。。。。。。。。
2010-12-28 17:32
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
打个比方,比如输入的字符串是:abc()()def,“()”代表空格。当你输完这个字符串加车时,字符串送出,getchar()开始获取,当取到第一个空格时,inspace变为1,并且输出这个空格,接下来又是一个空格,这时,inspace是1,那么因为if(inspace == 0)才可以输出,帮此时无法输出。略过了这个空格。下一个是d,这时,它不是空格,而if(c != ' ')时,inspace为0,故而下回碰到空格时又可以输出了。
2010-12-28 20:49
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
if(inspace == 0)
      {
        inspace = 1;
        putchar(c);
      }
当接收到第一个空格后,inspace = 1,以后连续的空格都不进入此执行,就不会putchar(c)了。
2010-12-29 15:48
0
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
恩!学习了!
2010-12-30 14:06
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
这个很简单的啊~~

它其实就是一个标志罢了, 第一次有空格进来的时候,他输出空格

如果连续输入空格,后面的都被屏蔽了,因为标志为1,进不去if里,就不输出空格

当不输入空格了,标志就改为0,恢复原来了.

这样就满足了题目了~~

其实这种问题,自己写写程序,调试着跑一下,就很清楚了.
2010-12-30 14:12
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
来学习了,实在不会
2011-1-1 15:01
0
游客
登录 | 注册 方可回帖
返回
//