Code Bye

求解while(cin>>word)的结束条件

 

如下程序:int  main() 

int word;
//string word;
while(cin>>word)
cout<<word<<endl;
system(“pause”);


当word是string型时,似乎一到换行 就终止读取了;而word是int型的时候换行后会一直输入,直到非法字符或者ctrl+z。
这个while(cin>>word)到底怎么理解,word是string型时结束条件是什么?为什么换行在string时可以结束循环,int时却没用

cin>>word也会有返回值,进而成为while()循环的判断条件.
10分
cin>> 根据后面变量的类型读取数据。
输入结束条件:遇到Enter、Space、Tab键,正常结束,返回真值。
对结束符的处理 :丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)

你说的第一种情况你确定是对的吗?我刚测试了,VS2012. 
输入 I 后,enter,继续输入love,再enter,还是继续输入界面。
你的string的头文件是什么?是不是头文件包含错了?

cin>>当输入数据类型和变量类型不匹配是会出错,返回假值;输入ctrl+Z也可以结束输入。

10分
没出现楼主说的情况,程序没有问题,如4楼所说,可能是你头文件出了问题吧。我用的是VS2005,完整的程序如下:
#include “stdafx.h”
#include <iostream> 
#include <string>

using namespace std;  
int main() {  
//int word;
string word;
while(cin>>word)
cout<<word<<endl;
system(“pause”);

引用 4 楼  的回复:

cin>> 根据后面变量的类型读取数据。
输入结束条件:遇到Enter、Space、Tab键,正常结束,返回真值。
对结束符的处理 :丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)

你说的第一种情况你确定是对的吗?我刚测试了,VS2012. 
输入 I 后,enter,继续输入love,再enter,还是继续输入界面。
你的string的头文件是什么?是不是头文件……

恩,是的,第一种情况我看错了。但是还是有个问题,当Word是string时什么时候结束呢?经常见到这样的:
getline(cin,line);
istringstream is(line);
while(is>>line)
{…}//以空格为界,分隔出每个单词
这里为什么通常到行尾就结束了?如果是while(in>>line),到换行的时候也不会结束啊,is为空的时候不是还要和cin一样等待输入吗?

如果是while(cin>>line),到换行的时候也不会结束啊,is为空的时候不是还要和cin一样等待输入吗?
这是我之前收藏的一段话
首先,cin是个对象,没有所谓返回
>>输入操作符返回流对象的引用,cin >> x 返回istream&,cout << x返回oostream&

if可直接判断流,如if (cin)
while间接判断,如while (cin >> x)
若流被标记错误(读取失败)就返回false.
ctrl+z,F6可跳出循环,这代表eof(文件结束符)

在ios,istream和ostream类中,还定义了若干输入输出函数,它们主要用于错误处理,流的刷新以及流输入输出方式的控制.
    错误处理
    在对一个流对象进行I/O操作时,可能会产生错误。当错误发生时,错误的性质被记录在ios类的一个数据成员中。

    ios类中定义的描述错误状态的常量:
       goodbit————-没有错误,正常状态 
       eofbit————–到达流的结尾 
       failbit————-I/O操作失败,清除状态字后,可以对流继续进行操作。 
       badbit————–试图进行非法操作,清除状态字后,流可能还可以使用。 
       hardfail————致命错误,不可恢复的错误。 
    对应于这些位,可用ios中定义的如下函数来检查流的当前状态位:
       int good()———如果正常,返回非0值
       int bad()———-如果badbit被设置,返回非0值
       int eof()———-如果eofbit被设置,返回非0值
       int fail()———如果failbit被设置,返回非0值
       int rdstate()——返回当前错误状态位.

    流的其它成员函数可以从流中读取字符或字符串,对流进行无格式化的输入 输出操作,以及直接控制对流的I/O操作。

返回类型         ostream类的成员                   描      述 
ostream&         put(char ch)                 向流中输出一个字符ch,不进行任何转换 
ostream&        write(char*,int)         向流中输出指定长度的字符串,不进行转换 
ostream&         flush( )                           刷新流,输出所有缓冲的但还未输出的数据 
ostream&        seekp(streampos)         移动流的当前指针到给定的绝对位置 
ostream&     seekp(sereamoff,seek_dir)   流的当前指针类似与文件的当前指针 
streampos        teelp( )                        返回流的当前指针的绝对位置 

istream类的成员函数

返回类型           istream类的成员                描       述 
int                      get( )                              读取并返回一个字符 
istream&            get(char&c)                  读取字符并存入c中 
istream&             putback( )                 将最近读取的字符放回流中 
istream&           read(char*,int)          读取规定长度的字符串到缓冲区中 
int                      peek( )                               返回流中下一个字符,但不移动文件指针 
istream&          seekg(streampos)           移动当前指针到一绝对地址 
istream&        seekg(streampos,seek_dir)    移动当前指针到一相对地址 
streampos              tellg( )                    返回当前指针 

还有这些,都是我之前遇到这个问题时收藏的,希望对你有帮助
一、关于输入运算符和cin的成员函数
cin >> a;
>> 是运算符, 有运算结果, 结果就是cin本身。
正因如此, 才可以书写下面语句:
cin >> a >> b;
该语句中的 >> 运算从左至右进行, 第一步 cin >> a 的结果是 cin
因此 cin >> a >> b 在完成a的输入后, 就变成了 cin >> b, 相当于
(cin >> a) >> b;

若用输入数据时发生了错误, 可用 cin.bad()、cin.fail()、cin.eof()来检测, 正如前面的回复所说。
另一种方法是用cin.good()来判断输入是否成功。下面是一个演示程序:
int a;
cin >> a;
while (! cin.good())
{
  cin.clear(); // 清除错误标记
  cin.sync();  // 清除已输入的字符
  cout << “请重新输入: “;
  cin >> a;    // 重新输入
}
cout << “a = ” << a << endl;
如果用户输入 haha<回车>, 将会提示用户重新输入。

二、关于cin的类型转换
if(…) 和 while (…) 语句的条件表达式, 被视为逻辑值, 非零为真, 零为假。
当 cin 出现在 if 语句和 while 语句的条件表达式中时, 将会自动转换为 bool 类型。
下面是 cin 转换为 bool 类型的例子:
bool b;
b = cin; // cin 转换为 bool 值并赋值给变量 b

cin 转换为逻辑类型时, 到底是什么值呢? 它是根据 cin 的状态决定的, 其结果与good函数的值一致。
所以可以将上面的演示程序可以简化为:
int a;
cin >> a;
while (! cin)
{
  cin.clear(); // 清除错误标记
  cin.sync();  // 清除已输入的字符
  cout << “请重新输入: “;
  cin >> a;    // 重新输入
}
cout << “a = ” << a << endl;

这个程序中有两处书写了相同的代码 cin >> a, 而该运算的结果就是 cin, 故可以再简化为:
int a;
while (! (cin >> a))
{
  cin.clear(); // 清除错误标记
  cin.sync();  // 清除已输入的字符
  cout << “请重新输入: “;
}
cout << “a = ” << a << endl;

10分
一般不要这么写。要那样写的话,在windows上用CTRL+X,在Linux用CTRL+D可结束输入。

通常while(cin>>word)可改写为:

while(true)
{
    cin >> word;
    if(word == 退出的条件) break;
}
10分
引用 10 楼  的回复:

一般不要这么写。要那样写的话,在windows上用CTRL+X,在Linux用CTRL+D可结束输入。

通常while(cin>>word)可改写为:
C/C++ code

while(true)
{
    cin >> word;
    if(word == 退出的条件) break;
}

你这么写要是cin>>word失败了一次就死循环了。
我写oj碰到多组数据遇0退出,都是写成while(cin>>n && n>0)这样。

同样的问题,也是很郁闷啊
好像是测试下
if(cin.fial)
{
cerr << “bad data, try again  “;
cin.clear();
icn.ignore(1024, “”\n””);
continue;
}
的话,如果输入Ctr+Z也是一直提示try again
.不能继续下面的操作。
if break == xxx break
是 Ctr+Z 吧
也遇到同样的问题,int时文件结束符就可以结束,string怎么不行呢?
string时,eof没用,Ctrl+Z也不行,后来发现Ctrl+Z再按Enter键可以

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求解while(cin>>word)的结束条件