如何阻止循环结束得太快?

How to stop the loop from ending too quickly?

提问人:oskarw7 提问时间:10/19/2023 更新时间:10/19/2023 访问量:87

问:

我的任务是创建一个游戏,其中四个玩家 G1-G4 正在掷骰子。首先,用户必须写入名为 X 的板长度(没有文件 0)。然后他分别为每个玩家写 1-6 的 M 加号。如果他想打印当前结果,他会写 P。当某人拥有 X 或更多时,他就赢了。我不能使用字符串。 我在这里有一个 while 循环问题。每次我尝试在输入中放置 M+smth 时,游戏都会在第一次迭代后结束。 queue 用于管理玩家掷骰子的次数(因为按 P 会导致迭代中断)

#include <iostream>
using namespace std;

int main(){
    unsigned int X, queue=0, g1=0, g2=0, g3=0, g4=0;
    char input[3];
    cin >> X;
    while(g1<X && g2<X && g3<X && g4<X){
        cin >> input;
        if(input[0]=='P'){
            cout << g1 << " " << g2 << " " << g3 << " " << g4 << endl;
            continue;
        } else{
            queue++;
            switch(queue%4){
                case 1: g1=g1+(input[2]-'0');
                case 2: g2=g2+(input[2]-'0');
                case 3: g3=g3+(input[2]-'0');
                case 0: g4=g4+(input[2]-'0');
            }
        }
    }
    cout << "END OF GAME";
    return 0;
}

我尝试在每个“案例”之后添加中断指令,将 switch 语句更改为 if/if else 并用 getchar() 替换输入。但是,以上方法都没有奏效。我还将 C 样式的 char 数组更改为字符串,但它给出了相同的结果。

C++ 循环 while 循环

评论

0赞 Ted Lyngmo 10/19/2023
“用户必须写入名为 X 的板长度(没有文件 0)”......“然后他分别为每个玩家写 1-6 的 M 加号”——我很难理解这个游戏的规则,这使得我很难理解你到底做错了什么。你希望做什么?您使用的是什么 C++ 版本?cin >> input;
0赞 Ted Lyngmo 10/19/2023
关于“我试图在每个”案例“之后添加中断指令” - 这通常是正确的做法,但由于我不知道你是否想要失败,所以很难说。
3赞 Ted Lyngmo 10/19/2023
'M',加上三个,没有空间' ''1'char'\0'
3赞 Igor Tandetnik 10/19/2023
input[3]不适合 - 没有空间用于终止 NUL 字符。如果是用户键入的内容,则程序会通过缓冲区溢出的方式表现出未定义的行为。P 6P 6
1赞 drescherjm 10/19/2023
我想你确实需要休息一下;在每个案例之后。话虽如此,看起来你不是使用调试器逐行执行代码,而是在每个步骤之后查看变量和流程,而只是在不了解它在做什么的情况下更改程序的随机部分。后一种方法会浪费大量时间,并且随着代码复杂性的增加而效果不佳。

答:

0赞 Hudson 10/19/2023 #1

您的代码似乎存在一些问题,涉及语法和内存。另外,尽量不要添加这个非常常提到的问题中列出的原因。using namespace std;

首先,对于内存,您需要小心使用 C 样式的字符串。你看,当你想要一个字符串时,比如说,n个字符,那么你实际上需要建立一个带有另一个内存字符的char数组,以便编译器可以将该字符添加到它的末尾。如果您想了解更多细节,请对此进行一些研究,但在处理 C 样式字符串时,请记住这一点。因此,只需将数组声明为大小为 4。'\0'input

其次,您发布的代码显示您在切换语句后没有添加任何关键字。你看,它的工作方式是,一旦它找到一个匹配的大小写,它就会在那之后执行行,直到它击中一个关键字或。如果它点击中断,它将退出开关。但是,如果它命中,它将继续执行您在它下面输入的行。breakswitchbreakcasecase

例如,使用您的代码,如果等于 2,则将输入值添加到 、 和 中。因此,如果您只想递增一个值,则需要在每种情况下都有一个。queue%4g2g3g4break

之后,我测试了我刚刚编辑的代码,并得到了正确的结果。您可以在此处获取带有输入的演示:

7
M+2
M+4
M+6
M+3
P
M+5

带有编辑和注释的新代码:

#include <iostream>
int main (){
    unsigned int X, queue=0, g1=0, g2=0, g3=0, g4=0;
    char input[4]; //Just simple change from 3 to 4 here to stop memory issues and correct the last character so it is your number, not some garbage value or forced '\0' character that could make the value you add (input[2] - '0') incorrect
    std::cin >> X;
    while(g1<X && g2<X && g3<X && g4<X){
        std::cin >> input;
        if(input[0]=='P'){
            std::cout << g1 << " " << g2 << " " << g3 << " " << g4 << '\n';
            continue;
        } else{
            queue++;
            switch(queue%4){
                case 1: g1=g1+(input[2]-'0'); break; // 4 breaks to stop other adding, that could potentially already make other values go over K
                case 2: g2=g2+(input[2]-'0'); break;
                case 3: g3=g3+(input[2]-'0'); break;
                case 0: g4=g4+(input[2]-'0'); break;
            }
        }
    }
    std::cout << "END OF GAME";
    return 0;
}
-1赞 Faxziz 10/19/2023 #2

首先,尽量不要添加:

使用命名空间 std;

另外,你在内存方面也有一些问题,因为你必须知道在数组的末尾存在一个 ,使用**'\0'**std::cin;

你必须添加语句,因为你只想一次增加一个值,并且在编写 imput 之后,你添加不杀死程序。break;continue;

评论

0赞 Hudson 10/19/2023
欢迎来到 SO, Faxziz!我只是想知道,你抄袭了我吗?另外,恐怕我不明白关于“杀死程序”的部分和声明。你能澄清一下吗?continue;
0赞 Faxziz 10/21/2023
嗨,哈德森?哦不,我没有抄袭你,我只是注意到我的评论与你的评论非常相似。对于“继续”这句话,我想说的是,如果你不把“继续”放在条件if上,while将无法正常工作,但也许是一个不好的观点。对不起:D
0赞 Hudson 10/21/2023
别担心。谢谢你的澄清。我猜,伟大的思想家的想法是一样的。