C++中cin和cout中不会被注意的细节(字符串的处理)

cout.put(ch);

与cout << ch;类似。但是只可以输出单个字符。

cin

cin使用空白(空格,制表符和换行符)来确定字符串的结束位置。

例子:

#include <iostream>
using namespace std;
int main()
{
        char ch[20];
        cin >> ch;
        cout << "ch = " << ch << endl;
}

可以看出cin只能读取一个单词,那么如何让cin读取一行字符串呢?

这里引入两个类的成员函数:

getline(char* ch,int n);

读取一行输入,直到到达换行符。丢弃换行符。

get(char* ch,int n);

读取一行输入,直到到达换行符。将换行符保留在输入序列中。

ch是用来存储输入行的数组名称;n是要读取的字符数(读取n-1个字符,后面加‘\0’空字符)。

例子:

#include <iostream>
using namespace std;
int main()
{
        char ch[20];
        cin.getline(ch,20);
        char sh[20];
        cin.getline(sh,20);
        cout << "ch = " << ch << endl;
        cout << "sh = " << sh << endl;
}


空行的问题

get()的问题

get()函数将换行符保留,那么下一个get()函数将读取空字符,而无法继续读取后面的字符了。

#include <iostream>
using namespace std;
int main()
{
        char ch[20];
        cin.get(ch,20);
        char sh[20];
        cin.get(sh,20);
        cout << "ch = " << ch << endl;
        cout << "sh = " << sh << endl;
}

解决方法:

使用不带任何参数的cin.get()或者;可以读取下一个字符(即使是换行符)。

#include <iostream>
using namespace std;
int main()
{
        char ch[20];
        cin.get(ch,20).get();
        char sh[20];
        cin.get(sh,20);
        cout << "ch = " << ch << endl;
        cout << "sh = " << sh << endl;
}


PS:有参数的get函数读到了空行(只有一个换行符)后,将设置失效位(failbit)。接下来的输入将被阻断(接收到的都是空的字符串)。要用下面命令进行恢复:

cin.clear();  //恢复输入
cin.get();    //吃掉换行符

getline()的问题

当输入的字符串比读取的个数长的时候,getline将设置失效位,并且关闭后面的输入。

#include <iostream>
using namespace std;
int main()
{
        char ch[20];
        cin.getline(ch,4);
        char sh[20];
        cin.getline(sh,4);
        cout << "ch = " << ch << endl;
        cout << "sh = " << sh << endl;
}

cin返回值

cin.get和cin>>返回一个cin对象,所以可以连写输入。

cin.getline(ch,20).get(sh,20);  //
cin >> ch >> sh; //小心空格
(cin >> ch).get(sh);

下面两个结果分别对应上面前两行代码:





猜你喜欢

转载自blog.csdn.net/lingfeng2019/article/details/77925837