c++中while(cin)不能执行的问题

前几天在用链表实现大整数求和的时候,因为要输入两个大整数,我接连使用了两个while(cin),但是运行的时候,却只能输入第一个整数,当第一个整数输入并回车后程序就直接就运行完毕,并没有输入第二个数的机会。

结果如下:

当时的代码:

# include <iostream>
# include <vector>
using namespace std;
struct ADD
{
	int number;
	struct ADD *next;
};
int main()
{
	vector<int> result;
	struct ADD *head_a = new ADD, *head_b = new ADD, *p, *p1, *p2, *q, *q1, *s, *temp;
	int count_a = 0, count_b = 0;
	s = p = head_a; q = head_b;        //头插法保存头结点
	head_a->next = NULL; head_b->next = NULL;
	p1 = new ADD;
	cout << "请输入第一个加数(每位数之间加一个空格且输入n结束):" << endl;
	while (cin >> p1->number) {                                      //*********************第一个while(cin)
		count_a++;
		p1->next = head_a->next;
		head_a->next = p1;
		p1 = new ADD;
	}
	cout << "请输入第二个加数(每位数之间加一个空格且输入n结束):" << endl;
	q1 = new ADD;
	while (cin >> q1->number) {                                      //***********************第二个while(cin)
		count_b++;
		q1->next = head_b->next;
		head_b->next = q1;
		q1 = new ADD;
	}
	if (count_b > count_a) {
		temp = p;
		p = q;
		q = temp;
	}
	s = p = p->next;
	q = q->next;
	while (q) {
		if ((q->number + p->number) < 10) {
			p->number = q->number + p->number;
		}
		else {
			p->number = (p->number + q->number) % 10;
			if (p->next) {                      //检测是否p->next还有值,如果位数相等则访问会有冲突
				(p->next)->number++;
			}
			if (!p->next) {                    //p->next为空即证明位数相等,因为已经确定p>=q的长度,加一个一
				p2 = new ADD;
				p2->number = 1;
				p->next = p2;
				p = p2;
				p->next = NULL;
			}
		}
		p = p->next; q = q->next;
	}
	while (s) {
		result.push_back(s->number);
		s = s->next;
	}
	for (auto c = result.rbegin(); c != result.rend(); c++) {
		cout << *c;
	}
	system("pause");
	return 0;
}

后来想到以前在使用stringstream流时每使用一次都要用到.clear()来清空流中的数据,但是加了之后还是不起作用,当时感觉那叫一个崩溃,后来请教学长才知道,原来还需要一个.ignore()

cin.clear();   //清除错误状态 
cin.ignore();//跳过无效数据

在两个while(cin)加入上边两行就正确了:

仔细想了想,问题就处在cin输入流对象上。cin是一个输入流对象,当进行第一个while循环时我输入了一个字母来结束循环,而最后输入字母完全是为了结束输入数字,这个字母没有任何的意义,所以加上cin.ignore()来路过无效数据,而此时第二个while(cin)因为使用同一个cin对象,所以也被判断为假,造成第二个循环不能执行,因此,要加上cin.clear()来清除错误状态,才能使第二个while(cin)能够正常执行。

这个以前真的时没注意过,发上来分享一下。

发布了37 篇原创文章 · 获赞 12 · 访问量 9279

猜你喜欢

转载自blog.csdn.net/weixin_43265881/article/details/88700819