C++递归重复输出

C++ recursion repeating output

本文关键字:输出 递归 C++      更新时间:2023-10-16

我有这个代码:

#include <iostream>
#include <vector>
#include <ctime>
#include <math.h>
#include <string>
using namespace std;
int main()
{
    srand(time(0));
    string command_one;
    int slot;
    cout<<"One chip or Quit?n";
    getline(cin, command_one);
    if(command_one=="One chip"){
        cout<<"Pick a slot between 0 and 8 (inclusive)n";
        cin>>slot;
        if(slot>=0 and slot<=8){
            double position=slot;
        }
        else{
            cout<<"This Option is invalid!n";
            main();
        }
    }
    else if(command_one=="Quit"){
        cout<<"Have a nice day! :D";
    }
    else{
        cout<<"This Option is invalid!n";
        main();
    }
}

当它到达嵌套在if(command_one=="one chip")中的else循环时,它返回

"此选项无效!
单芯片、多芯片还是退出
此选项无效
单芯片、多芯片还是退出?"

但应该是:

"此选项无效!
单芯片、多芯片还是退出?"

如何解决这个问题?

cin>>slot;

这会在流的缓冲区中留下数字后面的换行符。对getline的下一次调用会发现,并给出一条空行。

您可以使用ignore来忽略换行符和行尾的任何其他垃圾:

cin.ignore(-1, 'n'); // ignore any number of characters up to and including new-line

请注意,不允许调用main(尽管某些编译器可能允许);像这样的无界递归最终可能导致堆栈溢出。请考虑改用循环。

cin不接受n字符。getline()将其作为空行输入。放一个getchar()来取那个n字符。

#include <iostream>
#include <vector>
#include <ctime>
#include <math.h>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
    string command_one;
    int slot;
    cout<<"One chip or Quit?n";
    getline(cin, command_one);
    if(command_one=="One chip")
    {
        cout<<"Pick a slot between 0 and 8 (inclusive)n";
        cin>>slot;
        //putting a getchar() after cin
        getchar();
        if(slot>=0 and slot<=8)
        {
            double position=slot;
        }
        else
        {
            cout<<"This Option is invalid!n";
            main();
        }
    }
    else if(command_one=="Quit")
    {
        cout<<"Have a nice day! :D";
    }
    else
    {
        cout<<"This Option is invalid!n";
        main();
    }
}

std::getline:

从输入中提取字符并将其附加到str,直到出现以下情况之一(按列出的顺序选中)
a) 输入时的文件结束条件,在这种情况下,getline设置eofbit
b) 下一个可用的输入字符是delim,如Traits::eq(c, delim)所测试的,在的情况下,从输入中提取分隔符字符,但不将其附加到str

因此,您需要消耗剩余的n字符。