cin>>str;怎么判断cin中是否还有字符?

bbq1980 2004-09-08 02:01:43
在使用cin和std::string做标准输入时,我怎么知道cin中还有没有字符?
...全文
428 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
daylove 2004-09-09
  • 打赏
  • 举报
回复
while( cin )
{
}


------------------------------------------------------《爱晶如梦》
『唯我独坐寒江』
『难为春城美景』
『秋黛依影随行』
『紫晶轻舞我心』
bbq1980 2004-09-09
  • 打赏
  • 举报
回复
目的是达到了,但不知有没有问题,实例代码如下我自己觉得写法上不是很准确:

cin>>str; // 取得输入的最前面的数据
/////////////////////////////////
string str_var;
if ( 10 != cin.get() ) // 判断是否是以回车结束
{
const int meta = cin.peek();
if ((10!=meta) && (32!=meta)) // 如果不是以一些空格结束
{
cin>>str_var;
}
}
/////////////////////////////////
bbq1980 2004-09-09
  • 打赏
  • 举报
回复
虽然问题最后是我自己解决了但是还是要感谢一下大家
bbq1980 2004-09-09
  • 打赏
  • 举报
回复
上面的代码在Windows XP sp1 VS.NET 2003上没什么问题
bbq1980 2004-09-09
  • 打赏
  • 举报
回复
string str_var;
cin>>str_var;
/////////////////////////////////
int meta = 0;
// 取出最后一个字符,不等于回车
while (10 != (meta=cin.peek()))
{
if (32 == meta) // 空格
{
cin.get(); // 弹出最后一个字符
}
else
{
cin>>str_var;
cout<<str_var;
}
}
/////////////////////////////////
whyglinux 2004-09-08
  • 打赏
  • 举报
回复
>> 你说的不对,你那样会blocking住

呵呵,原来问题在这里:你还不知道“结束”输入的方法。

其实上面 plainsong(短歌) 已经对这个问题进行了分析,对于 cin 是键盘输入的情况,只有靠用户输入一个约定的结束符来通知 cin 数据输入到此结束。这个产生这个结束符的按键就是:

在Windows中,Ctrl+Z
在Linuz中,Ctrl+D

一般来说,输入数据结束之后,按 Ctrl+Z 或者 Ctrl+D 然后再按回车键就会退出上面的 while 循环。
bbq1980 2004-09-08
  • 打赏
  • 举报
回复
TO: whyglinux(山青水秀)
你说的不对,你那样会blocking住
whyglinux 2004-09-08
  • 打赏
  • 举报
回复
>> 其实我的目的就是怎样判断cin中有没有数据,如果有数据我在调用cin>>string;取得数据

这样实现:

while (cin>>string) { /* ... */ }

xjp6688 2004-09-08
  • 打赏
  • 举报
回复
cin.eof()
短歌如风 2004-09-08
  • 打赏
  • 举报
回复

  “判断cin中有没有数据”在cin是控制台本身是一个不成立的概念,当我们从控制台输入数据时,控制台会把它们放入到行缓冲中,直到遇到回车,这时你的程序就去接收数据,当把这一行数据都读完时如果程序还要求输入,则控制台再次接管程序,以便于用户输入。如果你要判断这一行是否还有数据,用getline就可以了;如果你要判断用户是否还会继续输入,那么你必须允许用户使用一个特殊输入来表示“我已经输入完了,不再输入了”,否则的话除了正在输入的用户自己就只有上帝知道如何判断了——如果上帝是程序员的话。

  此外,用文件结束进行判断是很常用的一种手段,所有的“过滤器”程序都是这样作的,因为它们需要对“所有输入”进行处理,所有输入就是对于文件中的全部内容。而在M$系统中表示控制台输入的文件结束方式就是<ctrl>-Z。
bbq1980 2004-09-08
  • 打赏
  • 举报
回复
TO: plainsong(短歌)
<ctrl>-Z实际上是出错了,而且在命令行的输入中这样也不太现实
其实我的目的就是怎样判断cin中有没有数据,如果有数据我在调用cin>>string;取得数据
bbq1980 2004-09-08
  • 打赏
  • 举报
回复
to: waini11(王子)
你这个是出错了
short int i;
if(!(cin>>i) )
{
cout<<"error"<<endl;
cin.clear();
}
cout<<i<<endl;
pacman2000 2004-09-08
  • 打赏
  • 举报
回复
cin.eof()看是不是true
注意,换行符也算是输入的!!!
sunlu_eric 2004-09-08
  • 打赏
  • 举报
回复
关于缓冲的问题还是用字符比较合适

char a,b;
cin>>a;
cin>>b;
你看,他并不把回车直接放到b中,
着就是,cin比scanf的好处的一部分吧,
不都说要尽量用cin吗????
当然是说C++了,哈哈哈。。。。。
sunlu_eric 2004-09-08
  • 打赏
  • 举报
回复
应该不会出现这样的问题吧,
我试了一下,没有呀!!!
waini11 2004-09-08
  • 打赏
  • 举报
回复
应该是无法判断的 比如
short int i;
cin>>i;
你可以输入999999999999999999999 他照样可以通过
短歌如风 2004-09-08
  • 打赏
  • 举报
回复
std::string str;
std::vector<std::string> strs;
while(std::getline(std::cin, str))
strs.push_back(str);

当cin是文件时读到文件尾,当cin是控制台时读到<ctrl>-Z字符。这是唯一标志cin文件结尾的方法。

不过,在每次执行完getline时,cin中其实都已经没有字符了,下一次调用是新输入的。因为cin是以行为单位输入的。

bbq1980 2004-09-08
  • 打赏
  • 举报
回复
晕~~不至于我都结不了帖吧,寒啊。。。
bbq1980 2004-09-08
  • 打赏
  • 举报
回复
兄弟们帮帮忙啊
bbq1980 2004-09-08
  • 打赏
  • 举报
回复
你弄错了,我说的是cin中,不是string中
加载更多回复(1)

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧