使用“ break For Loop”或“ goto”后的奇怪行为

问题描述 投票:-1回答:1

我试图解决一个打破内部“ for循环”的问题。在几次中断循环之后,它开始忽略内部循环。

它工作正常,没有间断或跳转。

我尝试使用std :: cout调试并检查M和m,然后“转到” std :: cin> M;它不再从输入中读取值。我想知道是什么原因造成的?还是我做错了什么?

我用过g ++

$ g++ main.cpp -o main.bin
$ ./main.bin < test.in > test.out

main.cpp中

#include<iostream>
#include<string>
#include<set>

int main(){
    int T;
    int M;
    std::cin >> T;

    for(int t=0;t<T;t++){
        std::cin >> M;
        std::set<std::string> groupA ={},groupB={};
        std::string answer = "Yes";
        std::string first, second;
        std::cout << "M: " << M << std::endl;
        for(int m=0; m<M;m++){
            std::cout << m << std::endl;

            std::cin >> first >> second;
            bool A1 = groupA.find(first) != groupA.end();
            bool A2 = groupB.find(first) != groupB.end();
            bool B1 = groupA.find(second) != groupA.end();
            bool B2 = groupB.find(second) != groupB.end();

            if( (A1 & B1) || (A2 & B2) ){
                answer = "No";
                goto end;
            }

            if( !(A1 | A2 | B1) ){
                groupA.insert(first);
            } else if ( !A1 & !A2 & B1 & !B2){
                groupB.insert(first);
            } else if (! (A2 | B1 | B2)){
                groupB.insert(second);
            } else if ( !A1 | A2 | !B1 | !B2){
                groupA.insert(second);
            }


        }
    end:
        std::cout << "Case #" << t+1 << ": " << answer << std::endl;
    }


    return 0;
}

test.in

10
8
AdaU121x123 Johnx999
AniU121ora XxxxUjjn
AniU121ora HuU121anog999
AniU121ora Johnx999
AdaU121x123 CatxSavidge
AdaU121x123 XxxxUjjn
AniU121ora CatxSavidge
AdaU121x123 HuU121anog999
10
Ujjphista Newxgenerator
Ujjphista Ursa
HuU121atriladane MaixHuU121an
Ujjphista MaixHuU121an
WhitexRauauauauait Hypnota
WhitexRauauauauait Newxgenerator
Ursa trimberxman
HuU121atriladane Newxgenerator
Ursa Hypnota
HuU121atriladane trimberxman
3
kittyxGirl BluexSnowU121an
BluexSnowU121an Rrdelette
Rrdelette kittyxGirl
10
Magenta GoldenxGlider
Tala HuU121anog999
ThexLightning Shiv
ThexLightning Prank
Magenta Shiv
Tala Prank
Trinity GoldenxGlider
Magenta Prank
ThexLightning HuU121anog999
Trinity HuU121anog999
10
ThexLightning StarxSapphire
Unicron QueenxOfxFauauales
Unicron AdaU121x123
XadyxQuark FuryxLeika
XadyxQuark StarxSapphire
ThexLightning AdaU121x123
AsuauaestosxXady QueenxOfxFauauales
Unicron XadyxQuark
AsuauaestosxXady StarxSapphire
ThexLightning FuryxLeika
10
HuU121atriladane trimberxman
Xashitri KingxGhidorah
HuU121anoctorxCyuauaer Tala
Xashitri Evinlea
HuU121anrxEvil Tala
HuU121atriladane KingxGhidorah
HuU121anoctorxCyuauaer Evinlea
HuU121anoctorxCyuauaer KingxGhidorah
HuU121anrxEvil trimberxman
Xashitri trimberxman
10
BoU121uauashell RaU121page
HuU121aneuce Ursa
BoU121uauashell Ursa
XadyxOctopus RaU121page
HuU121anoctorxCyuauaer BlackxMaU121uauaa
HuU121aneuce MadaU121exRrdege
HuU121anoctorxCyuauaer RaU121page
XadyxOctopus MadaU121exRrdege
HuU121anoctorxCyuauaer MadaU121exRrdege
XadyxOctopus BlackxMaU121uauaa
10
Cyuauaorgirl FuryxLeika
AsuauaestosxXady MargaretxLove
AU121azingxGrace FuryxLeika
Cyuauaorgirl Hypnota
HuU121anuelaxHuU121anent AU121azingxGrace
HuU121anuelaxHuU121anent Hypnota
AU121azingxGrace MargaretxLove
HuU121anuelaxHuU121anent Ujjphista
HuU121anuelaxHuU121anent FuryxLeika
AsuauaestosxXady Ujjphista
10
JadadxKreis Prdendcakes
MargaretxLove StarxSapphire
Stripdragon Ingra
Stripdragon Prdendcakes
Stripdragon StarxSapphire
AdaU121x123 StarxSapphire
JadadxKreis Ingra
AdaU121x123 RaU121page
AdaU121x123 Prdendcakes
MargaretxLove RaU121page
10
Xazara Srdethpaw
HuU121atrinsenxMacauauare Jewelee
Xazara AU121azingxGrace
Osira AU121azingxGrace
Osira Coachwhip
Coachwhip PrincessxPython
HuU121atrinsenxMacauauare PrincessxPython
Coachwhip Srdethpaw
Osira PrincessxPython
Osira Jewelee

test.out

M: 8
0
1
2
3
4
5
6
7
Case #1: Yes
M: 10
0
1
2
3
4
5
6
7
8
9
Case #2: No
M: 3
0
1
2
Case #3: Yes
M: 10
0
1
2
3
4
5
6
7
Case #4: No
M: 0
Case #5: Yes
M: 0
Case #6: Yes
M: 0
Case #7: Yes
M: 0
Case #8: Yes
M: 0
Case #9: Yes
M: 0
Case #10: Yes

c++ g++
1个回答
0
投票

当您跳出循环时,您不会阅读整个输入。

我不明白您要解决的问题,但让我们简化一下:

输入:

2
3
Yes
No
Yes
3
Yes
No
Yes

简单代码:

int T;
std::cin >> T;
for(int i = 0; i < T; ++i)
{
    int M;
    std::cin >> M;
    for(int j = 0; j < M; ++j) 
    {
        std::string line;
        std::cin >> line;
        if(line == "No")
            goto end;
    }
    end:
    std::cout << "Done";
}

现在,让我们逐步完成输入:

  1. 将循环数读入T(2)
  2. 将内部循环数读入M(3)
  3. 读取输入“是”,未输入if
  4. 读取输入“否”,输入if,然后使用goto跳过其余的迭代
  5. 将内部循环数读入M ...等等...下一个输入是“是”,不是数字!

您正在尝试读取输入到int的字符串。这将失败,因此std::cin处于失败状态(fail()返回true)。在清除流之前,所有进一步的读取尝试都不会做任何有用的事情。

© www.soinside.com 2019 - 2024. All rights reserved.