首页 > 代码库 > C++ cin的一些小特点问题

C++ cin的一些小特点问题

问题1:cin如何确定已完成字符串的输入?

由于不能通过键盘输入空字符,因此cin使用空白(空格,制表符和换行符)来确定字符串的结束位置;

这意味着cin在获取字符数组输入时只读取一个单词,读取该单词后,cin将字符串放在数组中,并自动在结尾添加空字符串;

例:

#include <iostream>

int main()
{
using namespace std;
const int Size=20;
char name[Size];
char things[Size];

cout<<"Enter your name:\n";
cin>>name;
cout<<"Enter the name of your favorite things:\n";
cin>>things;
cout<<things<<endl<<name<<endl;
return 0;
}

输出:

无空格时输出正常:

 

 

有空格时输出异常:

刚打完name后回车就直接出结果了,如下图:

 

问题2:

我设置的数组长度为

const int Size=20;

如果cin时输入的字符长度长于20,则也会有异常:

 

 

 

解决方案:

面向行的输入

getline()与get(),这两个函数都是读取一行输入,直到到达换行符;

但随后getline()将丢弃换行符,而get()将换行符保留在输入序列中;

1)getline()通过回车输入的换行符确定输入结尾,

  调用方法:cin.getline(xxx,xxx);等

       getline(cin,xxx,xxx);等

  具体MSDN;

      本例中,cin.getline(name,20);//最多读取19个字符,最后余下空间用于自动存储结尾处的空字符;

      getline()成员函数在读取指定的字符数目或遇到换行符停止读取,并用空字符替换换行符;

2)get()函数

该函数有几个变体,其中一个变体的工作方式与getline()类似,接受参数相同,解释参数也相同,并且都读到结尾;

但不再读取并丢弃换行符了,而将其留在输入队列中;

所以连续两次的读取将会出现问题;

解决方法:后面使用不带参数的get()可读取下一个字符(即使是换行符)

      第10行代码后插入一行加上cin.get();

     或合并写法  第10行改为  cin.get(name,Size).get();均可。

 

当getline()或get()读取空行后,get()(不是getline())将设置失效位置(failbit);接下来的输入被阻断,恢复用:cin.clear();

但输入字符串比分配空间长,则getline()与get()会将余下的字符留在输入队列中;

getline()遇到换行符后,会认为是一个空行,并将一个空字符串赋值给目标;解决的办法是先读取换行符并丢弃,包括get()函数;

例:cin>>year;

      cin.get();//或等同于  (cin>>year).get();