【问题标题】:strange loop logic in c++C++中奇怪的循环逻辑
【发布时间】:2014-10-27 17:15:58
【问题描述】:
std::cout << "How many turns do you want to do?" << std::endl << std::endl << std::endl;
    std::string turnsDefined;
    std::cin >> turnsDefined;
    //std::cin.sync();
    bool hasPassed = false;
    int objectSizeIniti = 0;
    int objectSizePost = 0;
    for(char c : turnsDefined){
        objectSizeIniti++;
    }
    bool boolForCharIsDigi[objectSizeIniti];
    for(bool _b : boolForCharIsDigi){
        _b = false;
    }

while(hasPassed != true){
        for(char c : turnsDefined){
            if(isdigit(c) == 0){
                boolForCharIsDigi[objectSizePost] = false;
            }else if (isdigit(c) != 0){
                boolForCharIsDigi[objectSizePost] = true;
            }
            bool allTrue = false;
            for(int i = 0; i < sizeof(boolForCharIsDigi)/sizeof(boolForCharIsDigi[0]); i++){
                if(boolForCharIsDigi[i] == false){
                    allTrue = false;
                    std::cin >> turnsDefined;
                    std::cout << "You may only use numbers to define the amount of turns. No decimals either." << std::endl << std::endl;
                    break;
                }else if(boolForCharIsDigi[i] == true){
                    allTrue = true;
                    hasPassed = true
                }
            }
        }
        objectSizePost++;
    }

我试图理解为什么上面的代码表现得如此奇怪。

我想做什么:

我正在获取输入并测试它是否仅包含数字。如果是,它只是传递循环(将 w-loop 正在检查的变量设置为 true)。如果输入确实包含数字以外的字符,它会请求另一个输入并警告用户。

发生了什么:它随机需要一些输入来实际接受“只有数字”的输入。总的来说,整个程序只是随机运行。

【问题讨论】:

  • 您是否尝试调试它以检查问题?如果您尝试逐步调试,您可以轻松找到问题的原因。
  • while(hasPassed != true) 让我畏缩。
  • @Jepessen 这就是我所做的。但没有帮助,因为我根本无法弄清楚逻辑。它的迭代真的很奇怪......
  • @FredLarson 我会改变它。但请不要仅仅为了这么说而发表评论。

标签: loops c++11 logic


【解决方案1】:

我正在尝试做的事情: 我正在获取输入并测试它是否仅包含数字。如果它 确实,它只是通过循环(设置变量 w-loop 是 检查是否为真)。如果输入确实包含除 数字,它会请求另一个输入并警告用户。

跳过调试部分,我建议你应该有std::all_of

if( std::all_of( turnsDefined.begin(), turnsDefined.end(), ::isdigit ) )
{
   // Correct input 
}

else
{
  // Warn the user, re-enter stuff   
}

【讨论】:

  • 非常感谢您的(工作)回答。但是我也想找出我在原始代码中做错了什么。
【解决方案2】:

在您的代码中,初始化“boolForCharIsDigi”的 for 循环永远不会更新实际数组:

for(bool _b : boolForCharIsDigi){
    _b = false;
}

问题在于 _b 是一个临时变量。您需要将其作为这样的参考:

for(bool& _b : boolForCharIsDigi){
    _b = false;
}

可能还有其他问题,但这个问题突然出现在我的眼前.. ;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    相关资源
    最近更新 更多