切换到c后陷入循环

时间:2013-01-25 00:56:48

标签: c

while (1)
{
    c = getchar();

    switch(state)
    {
      case 0:
          if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == Bit_SET))
          {
              state=1;
          }

          if ( c=='p')
          {
              state = 2;
          }
          break;

      case 1 :
          if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) != Bit_SET))
          {
              state = 0;
          }
          break;

      case 2:
          iprintf("%s",led_name_arr[i]);
          if (c=='r')
          {
              state=0;
          }
          break;

    }
}

我想要打印printf,然后达到state2 ..如何实现这一目标。下面是我试过的以及我被卡住的地方。

伪码:

if ( c==P)
{
  printf(" hi");
  state 2;
} 

**在这种情况下,printf语句不会被执行** 或

case 2:
  iprintf("%s",led_name_arr[i]);
  if (c=='r')
  {
    state=0;
  }
  break;

**在这种情况下,printf语句继续打印循环**

我不希望while循环停止,在一个连续的循环中我希望case 0继续工作,但是当它得到输入p ..它暂停并执行printf ...并等待直到它得到ar来恢复大小写0 ....因此,程序永远不会停止,但等待获得“P”或“R”来执行每个案例...我希望我有意义

任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:3)

您的break已脱离switch ... case而非while。你需要使用某种布尔标志来打破外部循环,例如:

bool someflag = true;
while(someflag){

   switch(something){
      case a:
         someflag = false; // set the flag so we break out of the loop
         break;            // break out of the switch-case so we don't enter case b
      case b:
         // do something else
         break;
   }
}

-------- EDIT, because I misunderstood the question ------------

我认为你的逻辑中需要一个额外的状态,现在(忽略状态1),你有两种状态:

  1. 等一个p,当你拿到一个时,转到2。

  2. 每个角色的
  3. printf,直到获得r,然后转到1

  4. 你想要的是:

    1. 等一个p,当你拿到一个时,转到2。

    2. 执行printf,然后转到3。

    3. 等一个r,当你拿到一个时,转到1。

答案 1 :(得分:1)

您已经使用while(1)语句创建了一个无限循环,该语句没有可能的退出。 switch中的break语句适用于switch语句,不是 while循环。你需要在交换机外面另一个break语句。

答案 2 :(得分:1)

我不确定你在问什么,但我很确定你想要的情况2是这样的:

case 2:
  iprintf("%s",led_name_arr[i]);
  while(c!='r')
  {
      c = getchar();
  }
  state=0;
  break;

答案 3 :(得分:0)

阱, 将状态初始化为0

编译并运行程序

首次输入p // here = 2

然后在这里输入r // state = 0

....由于while(1)

而继续循环

答案 4 :(得分:0)

因为你没有打破while(1)循环。再使用一次中断for while循环。