您的位置:首页 > 编程语言 > C语言/C++

cin cin.get() cin.getline() 2017年7月2日学习记录

2017-07-02 19:23 190 查看
时间:2017年7月2日

1.

#include <iostream>
#include <cstring>

sizeof(name);//用于计算整个数组的长度
strlen(name);//返回的是储存在数组中的字符串的长度,而不是数组半身的长度。


2.

cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,这意味着cin在读取有多个单词组成的句子时,往往只读取第一个空白前的单词就停止读取,并在读取的单词后添加空字符。

为了解决这个问题,istream中的类(如cin)提供了一些面向行的类成员函数,getline()和get()。着两个函数都能读取一行的输入,直到到达换行符。

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

示例代码:1.1

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
char namea[20];
char nameb[20];
cout<<"此次输入将用get()函数读取。"<<endl;
cin.get(nameb,20);
cout<<nameb<<endl;
cout<<"此次输入将用getline()函数读取。"<<endl;
cin.getline(namea,20);
cout<<namea<<endl;
return 0;
}


运行结果:



将函数前后调换

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
char namea[20];
char nameb[20];
cout<<"此次输入将用getline()函数读取。"<<endl;
cin.getline(namea,20);
cout<<namea<<endl;
cout<<"此次输入将用get()函数读取。"<<endl;
cin.get(nameb,20);
cout<<nameb<<endl;
return 0;
}


运行结果



可以看到当用get()函数作为第一次读取函数时,函数读取了“asd asd”,而程序运行到使用getline()时,直接跳过了用户输入,打印了换行符。因为get()函数只读取到换行符就停止读取,并将换行符继续留在输入队列中,程序运行到getline()时,因为换行符继续留在输入队列中,所以getline()先读取换行符,而换行符作为getline()结束的标志,使得用户就无法继续输入。

而第一次使用getline()时,函数一样读取了“asd ads”,并以换行符作为结束,但getline()丢弃了换行符,这样就当程序运行到get()时,用户就能继续输入。

解决办法

我们可以同个连续调用两次get()函数,使用户能继续输入

cout<<"此次输入将用get()函数读取。"<<endl;
cin.get(nameb,20).get();
cout<<nameb<<endl;


总结:

在C++ Primer Plus (第六版) p-81页中指出,get()使输入更仔细。例如,假设用get()将一行读入数组中。如何知道停止读取的原因使犹豫已经读取了整行,而不是由于数组已经填满呢?答案是查看下一个输入字符(get()将换行符保留在输入队列中),如果使换行符,说明已读取了整行;否则,说明该行中还有其他输入。在第17章将介绍这种技术。总之,getline()使用起来简单一些,但get()使得检查错误更简单些。

可以用其中的任何一个来读取一行输入;只是应该知道,它们的行为稍有不同。

C++ Primer Plus (第六版)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++