【问题标题】:Stuck in a loop after switch in c切换到c后陷入循环
【发布时间】:2023-03-27 14:52:01
【问题描述】:
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 ... 并等待直到它得到一个 r 来恢复 case 0 ....因此程序永远不会停止,而是等待“P”或“R”来执行每个案例......我希望我有意义

任何帮助将不胜感激。

【问题讨论】:

  • 缩进你的代码怎么样?
  • 不要在你的箱子里放额外的 {} 大括号。他们会让你感到困惑。
  • @CarlNorum 它确实有一个中断.. 检查代码中有 3 个中断

标签: c


【解决方案1】:

您的breaks 正在突破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. printf 为每个字符,直到你得到一个 r,然后转到 1

你想要的是:

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

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

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

【讨论】:

  • 但我不希望 while 循环停止,我不希望 while 循环停止...这将打破 while 循环...就像这种情况 0 继续工作,但是当它得到 p .. 它暂停并执行 printf ... 并等到它得到一个 r 以恢复 case 0 .... 我希望你明白我的意思
  • 哦,对不起,我的错误。好吧,当您收到p 时,您将进入状态 2,然后您在返回状态 0 之前等待 r。所以基本上您输入的每个字符都会有一个 printfp 之后,直到您输入r。应该发生什么?
  • 我想我现在明白你的问题了,我编辑了我的答案以添加更多信息。
  • 是的,你没看错,我还在继续打印
【解决方案2】:

我不确定你在问什么,但我很确定你想要什么,以防万一 2 是这样的:

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

【讨论】:

    【解决方案3】:

    您已经使用无法退出的 while (1) 语句创建了一个无限循环。 switch 中的 break 语句适用于 switch 语句,而不是 while 循环。您需要在 switch 之外再添加一个 break 语句。

    【讨论】:

      【解决方案4】:

      嗯, 将状态初始化为 0

      编译并运行程序

      第一次进入p //这里状态=2

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

      ....由于 while(1) 继续循环

      【讨论】:

        【解决方案5】:

        因为你没有打破 while(1) 循环。对 while 循环再使用一个 break。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多