C ++如果在goto之后未检查条件

时间:2016-11-19 21:54:37

标签: c++ if-statement conditional-statements goto

我正在开展一个简洁的游戏(这不是整个代码,只是我遇到了问题)并且我遇到了这个问题;填充条件后,它会回到开始状态,它会让我重新输入字符串,但是,无论我输入什么,我都会得到'无效' 。有谁知道为什么?我正在使用 GNU C ++编译器

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string command;
mainscreen:
    cout << "blab";
getlinething:
    cin.ignore();
    getline(cin, command);
    if (command == "task")
    {
        goto mainscreen;
    }
    else
    {
        cout << "Not valid.";
        goto getlinething;
    }
    return 0;
}

4 个答案:

答案 0 :(得分:1)

当我使用调试打印运行代码时,它显示每次读取新命令时都会丢失字符串的第一个字符。事实上,当我删除你的cin.ignore()它工作正常。 另外,看看,看看它是否符合您的需求:

cout << "blab";
while(1){
    getline(cin, command);
    if(command == "task"){
        cout << "blab";
        getline(cin, command);
    }
    else{
        cout << "Not valid.";
    }

}

答案 1 :(得分:0)

至少为了调试目的,为什么不这样做

cout << "'" << command << "' Not valid" << endl ;

答案 2 :(得分:0)

好吧,我测试了一下。没有cin.ignore(),我根本无法将数据输入到字符串中。 我第一次进入它会抓住一切。因此,如果我写任务,字符串会说'task',但是第二次输入它时,它会说'ask'。我真的不知道为什么会这样做。

答案 3 :(得分:0)

默认情况下,cin.ignore()行会丢弃一个字符(除非遇到EOF,这对cin)来说是一个相当慎重的行为。

因此,假设用户输入task然后点击回车键。 cin.ignore()将丢弃't'command字符串将包含"ask"。如果您想获得匹配,则第一次用户需要输入ttask。在任何一种情况下,新行都将被丢弃。在遇到匹配之前会发生同样的情况。