回 帖 发 新 帖 刷新版面

主题:switch的问题?觉得很诡异···

嗯,书上的一个习题,说输入一行字符,如果中间有多个空格就将其合并成一个空格,然后···编了个程序,用的是switch语句,后来检查发现了一个问题,但是运行又没问题,感觉很诡异,不明白最后的结果是怎么达到的···嗯,我先把程序贴出来吧
#include "stdio.h"
#define COPY 0
#define START 1
#define END 2
#define SPACE ' '
void main()
{
    char c,state;
    state=COPY;
    while((c=getchar())!='\n')
    switch(state){
     case COPY:
         if(c==SPACE)
         {
             state=START;
             putchar(c);
             break;
         }
     case START:
         if(c==SPACE) state=END;
         else putchar(c);
     case END:
         if(c==SPACE) 
         {
             state=START;
             break;
         }
         else state=COPY;
     }
}
问题在  “case COPY:”  这里,按理来说,如果第一个字符不是空格,那么case COPY 后面的语句应该不会执行,但是这个时候 state 的值仍然是“COPY”,按理来说,第一个字符应该不会输出,但是实际上它们还是出来了,这是运行结果:
输入:hi      this    is  a    program by    liu
输出:hi this is a program by liu
为什么会这样呢???嗯,我不是要正确的程序,因为我自己已经改好了,就是希望懂的人来解释一下,为什么会这样捏~~~    
[img]http://[/img]

回复列表 (共7个回复)

沙发

很简单,你忘了加break导致了fallover的发生,也就是说做过判断之后直接执行后面的case去了
具体来说就是在case SPACE的if语句后面,case START前面少了一句break

板凳

诡异?

3 楼

别老怀疑编译器,先从自己身上找找原因

4 楼


即使state的值还是COPY而不是start也会往下执行么??

5 楼

在switch语句里,当发现第一个匹配的case后,程序将顺序向下执行,直到碰到break语句或switch语句结束,跳出switch语句,如果state的值还是COPY而不是start,且c值不是空格的话,程序还会往下执行。楼主的程序之所以能运行成功,是因为你的第2,3个case语句执行的结果,刚好符合题意,基本等价于 
  case START:
         if(c==SPACE) break;
         else
         {
             putchar(c);
             state=COPY;
             break;
         }

6 楼


哈,没加break语句,,导致再执行

7 楼


三楼的哥们你是理解错了我的意思,我没有怀疑编译器,我只是对switch语句还有些疑问而已

我来回复

您尚未登录,请登录后再回复。点此登录或注册