问题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();