请问一下关于cin的有关问题

请教一下关于cin的问题
本帖最后由 xyz951000 于 2015-04-13 21:48:42 编辑
C++Primer Plus里的例子
#include <iostream>
int main()
{
      using namespace std;
      cout<<"What is your house built?\n";
      int year;
      cin>>year;
      cout<<"What is its street address?\n";
      char address[80];
      cin.getline(address,80);
      cout<<"Year built:"<<year<<endl;
      cout<<"Address:"<<address<<endl;
      cout<<"Done!\n";
      return 0;
}
cin读取年份的时候,将回车键生成的换行符留在了输入队列中,cin.getline()看到换行符后,将认为是一个空行,将一个空字符串赋给address数组
1、我想问的是混合输入数字和面向行的字符串会导致问题,那混合输入字符串和面向行的字符串会导致问题吗?
2、还有输入数字然后按回车键后,回车键生成的换行符留在了输入队列,那么在其他的例子里,如果输入字符串然后按回车键,会把回车键生成的换行符留在输入队列吗?
3、如果数字和字符串一样的话,这里为什么强调是混合输入数字呢?
万分感谢!!
------解决思路----------------------
引用:
Quote: 引用:

cin的读取规则是:只要读到的东西是合法的,就从上一个回车、空格或tab开始读,一直读到下一个回车、空格或者tab
所以很多cin一起用,即使他们读到的类型不同,只要都合法,就不会有问题

cin.getline的读取规则是:只要读到的东西是合法的而且没有超过长度限制,多个cin.getline一起用也不会有问题~~因为cin.getline会把每次输入的回车丢掉,也就是输入缓冲区里也没回车、读到的字符串也没回车(而是\0结尾的)

只有在cin和cin.getline一起混用的时候,才会需要考虑是否有回车会干扰输入的问题

另外,cin和cin.getlien在碰到非法输入或者cin.geline超过最大长度的时候,都会停止读入,也就是说从出错的地方开始,后面的cin或者cin.getline都停止工作了-----这是因为cin有三个bool做标志,碰到这种错误会把其中一个标志设置为false,当这个标志为false的时候,cin就不工作了~~~这个时候要想让cin重新工作,需要调用cin.clear()清除掉false标志~~~
比如,
char str[8];
cin.getline(str, 5);
cout<<str;
cin.getline(str, 5);
cout<<str;
运行此程序后,第一次输入abcdefgdddsa,然后回车;则程序直接结束,并不会让你进行第二次输入,屏幕上会显示一行abcd和一行空行~~~
因为第一次输入的长度超过了5,如上面所说,第一次读入结束后就停止工作了~~
而如果你在第一个cout后面加一句:cin.clear()
第一次输入并按回车后,程序直接结束,显示两行:abcd和dfgd  这是因为那个clear把cin的状态还原了,所以第二次可以正常读入,而第二次读的时候,由于第一次输入的还在缓冲区里,所以直接拿缓冲区里的,不需要键盘输入


char yee[10];
cin>>yee;
cout<<yee;
这样输入abc然后点击回车后,是把abc放在了yee[10],并把\0放在abc后的结尾,回车留在了输入队列,这样的过程理解有误吗?

正确