使用cin时遇到的一些错误与解决

练习数据结构时,当创建链表时需要输入数据域的内容,也即在create()函数中用到了cin,create()中的cin是以while(cin)来检测cin的状态作为循环的终止,但是当多次调用create()时,只有第一次完全输入正确,以后的要么就是不等待输入,要么就是输入的和得到的不匹配。

思考了一下,觉得是cin的问题,因为第一次输入完成,也即遇到一个输入使得cin返回false,但是这个输入依然保留在cin中,并未被刷新,于是在每次while(cin)前加上了cin.clear(),问题依旧。上网查到是要添加cin.ignore(),加上试了下,果然好了。

于是查了一下,cin.clear()和cin.ignore();

http://www.cplusplus.com/给的解释分别如下:

std::istream::ignore:

Extracts characters from the input sequence and discards them, until either n characters have been extracted, or one compares equal to delim.就是说它会丢弃原本在输入流中的内容,直到遇到一个

delimiter(定界符)。

对应于我的例子,就是将第一次输入中最后一个用来标识结束的字符丢弃掉。从而输入就正常了。

ios::clear

Sets a new value for the stream's internal error state flags.也就是将流的所有状态都重设为有效状态。

对应于我的例子,就是将上一次的cin重设为有效。


好吧。虽然很简单,但是不注意的话会导致不明原因的bug,浪费宝贵的时间来调试。所以还是值得注意一下的。


顺便贴一下我用单链表实现的多项式相加:

//单链表的应用
//-------------
//多项式相加
//每个多项式为一个单链表,链表数据域为系数和指数
//多项式的相加可抽象为两个单链表的Merge操作

#include <iostream>
using namespace std;

typedef struct LNode
{
	float coef;  //系数
	int expn;	 //指数
	LNode* next;
}LNode,*List;

void createList(List& L)
{
	float coef;
	int expn;
	L=(List)malloc(sizeof(LNode));
	L->next=NULL;
	LNode* q=L;
	while((cin>>coef)!=NULL)
	{ 
		cin>>expn;
		LNode* p=(LNode*)malloc(sizeof(LNode));
		p->coef=coef;
		p->expn=expn;
		p->next=q->next;
		q->next=p;
		q=q->next;
	}
}

void visit(float f,int i)
{
	cout<<"coef: "<<f<<" "<<"expn: "<<i<<endl;
}

void ListTraverse(List L,void (*visit)(float,int))
{
	L=L->next;
	while(L!=NULL)
	{
		visit(L->coef,L->expn);
		L=L->next;
	}
}

void add(List& polyA,List& polyB,List& result)
{
	LNode* pa=polyA->next;
	LNode* pb=polyB->next;
	LNode* pc=polyA;
	result=polyA;
	while(pa!=NULL&&pb!=NULL)
	{
		if(pa->expn<pb->expn)
		{
			pc->next=pa;
			pc=pc->next;
			pa=pa->next;
		}
		else if(pa->expn>pb->expn)
		{
			pc->next=pb;
			pc=pc->next;
			pb=pb->next;
		}
		else
		{
			pa->coef+=pb->coef;
			pc->next=pa;
			pc=pc->next;
			pa=pa->next;
			LNode* tmp=pb;
			pb=pb->next;
			free(tmp);
		}
	}
	if(pa==NULL)pc->next=pb;
	if(pb==NULL)pc->next=pa;
}

int main()
{
	List polyA,polyB;
	createList(polyA);
	ListTraverse(polyA,visit);
	cin.clear();
	cin.ignore();
	cout<<"----------------------"<<endl;
	createList(polyB);
	ListTraverse(polyB,visit);
	List result;
	cout<<"-----------------------"<<endl;
	add(polyA,polyB,result);
	ListTraverse(result,visit);

	system("pause");
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值