这段关于处理错误输入的代码怎么修改才能更优雅一些?
#include <iostream>感觉清空输入缓冲区的那个地方不是特别漂亮,但是我的意思不是可以跳过错误(类似“(1,p)(2,3)”这种输入不必跳过第一个读取第二个),我要的效果是一旦发现错误便不会读入任何东西。把主函数中的处理输入的代码单独放到函数里就不要说了,我知道。
#include <vector>
#include <cstdlib>
using namespace std;
struct Point
{
int x;
int y;
};
istream& operator>>( istream& is, Point& p )
{
char ch;
is >> ch;
if( ch != '(' ) {
is.putback( ch );
is.clear( ios_base::failbit );
return is;
}
char c1, c2;
int i1, i2;
is >> i1 >> c1 >> i2 >> c2;
if( !is )
return is;
if( c1 != ',' || c2 != ')' ) {
is.clear( ios_base::failbit );
return is;
}
p.x = i1;
p.y = i2;
return is;
}
ostream& operator<<( ostream& os, Point p )
{
os << '(' << p.x << ',' << p.y << ')';
return os;
}
int main()
{
vector< Point >vp( 7 );
Point p;
int index = 0;
while( index < vp.size() ) {
if( cin >> p ) {
vp[ index ] = p;
++index;
cout << "input succeed, count: " << index << endl;
}
else {
cin.clear();
cin.sync(); //这个地方好像不是非常优雅。
cout << "input error." << endl;
}
}
for( int i = 0; i < vp.size(); ++i )
cout << vp[i] << endl;
system( "pause" );
return 0;
}
#include <stdio.h>
char s[]="123 ab\t4\n5\n6";
char *p;
char c;
int n,k;
char *ch(char cc) {
static char s[3];
if ('\t'==cc)
sprintf(s,"\\t");
else if ('\n'==cc)
sprintf(s,"\\n");
else
sprintf(s,"%c",cc);
return s;
}
void main() {
p=s;
while (1) {
k=sscanf(p,"%c%n",&c,&n);
printf("k,c,n=%d,%s,%d\n",k,ch(c),n);
if (1==k) {
p+=n;
} else if (0==k) {
printf("skip char[%s]\n",ch(p[0]));
p++;
} else {//EOF==k
break;
}
}
printf("End.\n");
}
//k,c,n=1,1,1
//k,c,n=1,2,1
//k,c,n=1,3,1
//k,c,n=1, ,1
//k,c,n=1,a,1
//k,c,n=1,b,1
//k,c,n=1,\t,1
//k,c,n=1,4,1
//k,c,n=1,\n,1
//k,c,n=1,5,1
//k,c,n=1,\n,1
//k,c,n=1,6,1
//k,c,n=-1,6,1
//End.