如何使 std:::cin 将输入到第一个非整数,然后丢弃其余的?

How can I make std:::cin take input up to the first non-integar and then discard the rest?

提问人:Ryan Goods 提问时间:12/20/2022 最后编辑:Ryan Goods 更新时间:12/20/2022 访问量:55

问:

此代码当前的作用方式是,如果输入非数字,它将设置错误标志,清除错误然后忽略。

但是,如果用户输入一个数字,后跟一个非数字,例如 2garbage1,它将成功并将 5 传递到第一个变量 \n 中,将 garbage1 传递到第三个变量中。


> 
do {
    std::cout << "\n\nPlease Enter the number of Names you would like to store: ";
    std::cin >> noOfNames;  // get user input for the number of names the user would like to enter.



    if (!(valid_input = std::cin.good())) { // if valid input does not = true 
        std::cout << "That input is invalid!\n";
        std::cin.clear(); //Clear stream to remove error flag
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignore everything and deliminate with \n     


    }
} while (!valid_input);

for (int i = 0; i < noOfNames; i++) //forloop which will iterate through the number of names getting user input on each iteration
{
    std::cout << "Enter name #" << i + 1 << ": "; // the i + 1 will avoid displaying name #1 as name #0 since i begins at 0
    std::cin >> tempName; // get user input and store it in tempName
    vec2.push_back(tempName); // add tempName to vec2
}

如果输入 2garbage1,它将输出以下内容:

“请输入您要存储的名称数量:2garbage1

名称 #1 = 名称 #2 =
垃圾 1

显然这并不理想,我想在最终数字之后丢弃任何东西。

链接和资源,以便我也可以阅读/观看有关该主题的视频,我将不胜感激,我似乎无法在谷歌上找到我正在寻找的内容,即使我找到了,我也想了解代码在做什么。

C++ 用户输入 IOSTREAM CIN

评论

1赞 john 12/20/2022
这其实并不复杂。将输入读取为字符串,分析字符串以查看它是否符合您对数字的期望,如果是,则将字符串转换为数字,否则发出错误信号。我猜你的错误是假设他们会是某种“快速”的方法,但事实并非如此。如果您有特定的输入要求,那么您将不得不编写代码。
0赞 Pete Becker 12/20/2022
请记住,与所有流一样,以文本而不是数字进行流量。有一些方便的函数可以将该文本转换为数字,但如果它们对您需要的内容不方便,请不要使用它们。std::cin

答: 暂无答案