前几天在用链表实现大整数求和的时候,因为要输入两个大整数,我接连使用了两个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)能够正常执行。
这个以前真的时没注意过,发上来分享一下。