3

我是 C++ 编程新手,遇到了障碍。这是我的代码:

#include <iostream>
using namespace std;

int main(){

    int sum = 0, a;
    cout << "enter first set of numbers:";
    while(cin >> a) sum += a;
    cout << "first sum = " << sum;
    cin.clear();
    cin.ignore( numeric_limits<streamsize>::max(), '\n');

    sum = 0;
    cout << "enter second set of numbers:";
    while(cin >> a) sum += a;
    cout << "second sum = " << sum;
}

我正在尝试对我在命令行输入的两组数字求和。问题是当我按下 ctrl-d 来终止我的第一组数字时,它会跳过第二组 cin。我在互联网上其他地方找到的大多数页面都告诉我使用 cin.clear 和 cin.ignore。我已经尝试过了,它仍然无法正常工作。这个关于 cin.clear()的页面问题甚至似乎也有同样的问题。但是,他们建议的修复对我不起作用。

上面的代码对其他人有用吗?

4

3 回答 3

2

当您使用 Ctrl-D 时,您会终止输入流:不再有来自std::cin. 即使清除流也无济于事:您已经告诉流它已经结束了。你不能重新打开它。但是,clear()使用流和使用ignore()是您问题的解决方案!

您需要一个不同的指标来表明一组值已完成。最简单的是使用非数字字符或字符串:尝试读取不是的int内容将导致流进入故障模式[不关闭流]。也就是说,您一直阅读直到转换失败、clear()流以及ignore()直到行尾的所有内容。

您的代码应该已经这样做了:不要使用 Ctrl-D,只需输入,例如x.

于 2013-11-14T03:06:47.053 回答
0

//使用stringstream ^^进行多用户输入

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main (void)
{
    string mystr;
    float price = 0;
    int quantity = 0;

    cout << "Enter price: ";
    getline (cin, mystr);
    stringstream(mystr) >> price;
    cout << "Enter quantity:";
    getline (cin, mystr);
    stringstream(mystr) >> quantity;
    cout << "Total price: " << price*quantity << endl;

    return 0;

}
于 2016-11-15T23:16:48.133 回答
-1

您可以使用 Ctrl-D,您只需要将循环放在另一个线程中。所以 Ctrl-D,杀死线程,然后返回到你的主函数,然后你可以启动另一个线程。这不是最好的解决方案,但它可以工作,http://codebase.eu/tutorial/posix-threads-c/

于 2013-11-14T03:58:10.860 回答