【问题标题】:While loop continuing after break condition met满足中断条件后循环继续
【发布时间】:2020-11-29 20:13:18
【问题描述】:

我当前的任务要求我允许用户传递字符串并将罗马数字转换为十进制值。我遇到了一个问题,当随机单词通过程序时,它必须返回最长的有效前缀并忽略剩余的字符。我的代码通过一个while循环运行,一旦达到中断条件,它就会再次为剩余的字符重复代码。我不确定下一步应该采取什么措施来修复此代码以正确输出。下图显示了要通过代码的字符。 Image of test failure

#include <iostream>
#include <ctype.h>

using namespace std;
int
main (){
   while (!cin.eof ()){
    char inputChar;
    int result = 0;
    while (cin.get (inputChar))
    {
        inputChar = toupper (inputChar);
        if (inputChar == 'M')
            result = result + 1000;
        else if (inputChar == 'D')
        {
            inputChar = cin.peek ();
            inputChar = toupper (inputChar);
            if (inputChar == 'M')
            {
                result = result - 500;
                continue;
            }
            else if (inputChar == 'D'){
                result = result;
                continue;
            }
            else
            {
                result = result + 500;
                continue;
            }
        }
        else if (inputChar == 'C')
        {
            inputChar = cin.peek ();
            inputChar = toupper (inputChar);
            if (inputChar == 'M' || inputChar == 'D')
            {
                result = result - 100;
                continue;
            }
            else
            {
                result = result + 100;
                continue;
            }
        }
        else if (inputChar == 'L')
        {
            inputChar = cin.peek ();
            inputChar = toupper (inputChar);
            if (inputChar == 'M' || inputChar == 'D' || inputChar == 'C')
            {
                result = result - 50;
                continue;
            }
            else
            {
                result = result + 50;
                continue;
            }
        }
        else if (inputChar == 'X')
        {
            inputChar = cin.peek ();
            inputChar = toupper (inputChar);
            if (inputChar == 'M' || inputChar == 'D' || inputChar == 'C'
                || inputChar == 'L')
            {
                result = result - 10;
                continue;
            }
            else
            {
                result = result + 10;
                continue;
            }
        }
        else if (inputChar == 'V')
        {
            inputChar = cin.peek ();
            inputChar = toupper (inputChar);
            if (inputChar == 'M' || inputChar == 'D' || inputChar == 'C'
                || inputChar == 'L' || inputChar == 'X')
            {
                result = result - 5;
                continue;
            }
            else
            {
                result = result + 5;
                continue;
            }
        }
        else if (inputChar == 'I')
        {
            inputChar = cin.peek ();
            inputChar = toupper (inputChar);
            if (inputChar == 'M' || inputChar == 'D' || inputChar == 'C'
                || inputChar == 'L' || inputChar == 'X' || inputChar == 'V')
            {
                result = result - 1;
                continue;
            }
            else
            {
                result = result + 1;
                continue;
            }
        }
        else{
            break;
        }
    }
    if (result != 0)
    {
        cout << result << endl;
    }
}
return 0;
}

【问题讨论】:

  • 不需要那些continue; 语句。

标签: c++ c++11 while-loop


【解决方案1】:

也许尝试在外循环结束时清除缓冲区。这样,最长的前缀就会被打印出来,并且不会在迭代中再次使用相同的单词。

    if (result != 0)
    {
        cout << result << endl;
    }
    cin. ignore(10000, '\n'); //used to ignore or clear characters from the input buffer
}

【讨论】:

    【解决方案2】:

    您的break 语句不会退出两个while 循环。它只打破了内部循环,而不是外部循环。您可以使用标志告诉外部循环不要继续:

    int main() 
    {
       bool exit_loop = false; // define a flag here
       while (!cin.eof()) {
          char inputChar;
          int result = 0;
          if (exit_loop) // check the flag here
             break;
          while (cin.get(inputChar))
          {
    

    在打破时将平面设置为真:

     }
     else 
     {
        exit_loop = true; // set the flag here
        break;
     }
    

    【讨论】:

    • 我忘了补充一点,这段代码必须继续处理输入,直到用户不再输入输入行,因此我相信以 while (!cin.eof()) 开头。如果我要实现这些更改,代码只运行一次。
    • @sheac95 好的,如果是这样的话,我想你现在可以很容易地修复你的代码了。
    • 如果这很容易解决,我应该采取什么下一步行动,因为我仍然迷路
    猜你喜欢
    • 2017-02-03
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多