为了账号安全,请及时绑定邮箱和手机立即绑定

C++如何不使用字符串读入一行不定数目的整数?

C++如何不使用字符串读入一行不定数目的整数?

桃花长相依 2019-04-19 16:12:45
本来以为while(cin>>a[n++]);可以直接读入一行结束,但是发现根本无法退出循环,用VS调试到行尾就看不到内容了,而此时循环没有退出也没有报错。大概是把换行符当整数读入了所以cin并没有fail?然后尝试了:inttemp;while(true){cin>>temp;if(temp=='\n')break;a[n++]=temp;}样例可以过,但是依然不能AC(OJ上的一道题),我想大概是可能有跟\nASCII值相同的整数。当然,可以用字符串先整行读入再解析,但是难道C++中没有更好更简洁的方法吗?因为问题本身并不难。
查看完整描述

2 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

自己处理空格还是蛮麻烦的。一般用sstream就好,真要想自己做,也是可以。
#include
usingnamespacestd;
//returntrueif\n,orreturnfalse
boolescape_white_space(istream&is)
{
chardummy;
while(true)
{
is>>dummy;
if(dummy=='\n')
{
returntrue;
}
elseif(!isspace(dummy))
{
is.putback(dummy);
returnfalse;
}
}
}
intmain()
{
inta[10];
cin>>std::noskipws;
intn=0;
while(true)
{
if(escape_white_space(cin))
break;
cin>>a[n++];
}
for(inti=0;i{
cout<}
return0;
}
再延伸一步,可以自己写一个manipulator。
//willabsorbwhitecharacterbutiflinebreak,thenseterror
istream&ws_on_lb_error(istream&is)
{
chardummy;
while(true)
{
is>>dummy;
if(dummy=='\n')
{
is.setstate(ios_base::failbit);
returnis;
}
elseif(!isspace(dummy))
{
is.putback(dummy);
returnis;
}
}
}
怎么用呢?和标准的manipulator一样用!
inta[10];
cin>>std::noskipws;
intn=0;
//假设开头没有任何whitespace
while(cin>>a[n++]>>ws_on_lb_error)
{
}
cin>>xyz返回false的唯一原因是failbit或者badbit被设置了。所以你自己写可以自己根据\n设置failbit。
                            
查看完整回答
反对 回复 2019-04-19
?
哔哔one

TA贡献1854条经验 获得超8个赞

用cin读int会直接跳过空格回车,没办法区分是否换行。
一个办法是把整行读出来然后再用sscanf或者sstream,这样也不算很麻烦。直接读大概是没办法了。
                            
查看完整回答
反对 回复 2019-04-19
  • 2 回答
  • 0 关注
  • 724 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信