C++:string::cin小结


1. 背景

  学习C++,cin是无可避免的,现对cin进行一些小结。

2. 小结

  1. cin是istream对象,用来从标准输入读取数据。具体过程:键盘输入数据->数据保存至缓冲区->cin从缓冲区读取数据。
  2. cin.sync()用于清空缓冲区。
  3. cin.clear()用于修改cin状态标识符。

3. 示例

3.1 一次cin

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

int main()
{
    string s1, s2;
    cin >> s1;
    cout << s1 << endl;
    return 0;
}

运行结果

说明:当输入" 12 34"换行时,cin忽略开头的空白(空格符、换行符、制表符等),从有效数据开始读取,即从"1"开始,遇到下一处空白便会结束读取,即只读到"2"。cin不算正常结束,因为缓冲区中还保留数据:"34"和换行符。

3.2 两次cin

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

int main()
{
    string s1, s2;
    cin >> s1;
    cout << s1 << endl;

    cout << "----------------------------" << endl;
    cin >> s2;
    cout << s2 << endl;

    return 0;
}

运行结果

说明:
1. 当输入" 12 34"换行时,程序直接输出"12"和"34",不会让人继续输入s2。其原因是输入s1时,cin已经将"12"读取,但缓冲区中还留有"34"和换行符。当下次输入时,cin已经默认读取"34",遇换行符结束。
2. 正确输入方式应该是先输入"12"换行,再输入"34"换行。换行可使cin正常结束读取数据。

正确输入方式的运行结果

3. 插入cin.sync()清空缓冲区数据,也能正确实现两次输入。因为第1个cin读完"12"后,缓冲区被清空。第2个cin从缓冲区读数据时,数据为空,需重新输入。

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

int main()
{
    string s1, s2;
    cin >> s1;
    cout << s1 << endl;

    cin.sync(); //清空缓冲区数据
    cout << "----------------------------" << endl;

    cin >> s2;
    cout << s2 << endl;
    return 0;
}

运行结果

3.3 文件结束符(Ctrl+Z)后cin

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

int main()
{
    string s1, s2, s3;
    while (cin >> s1)//对输入的字符串进行连接
    {
        s2 += s1;
    }
    cout << s2 << endl;

    cout << "------------------------" << endl;

    cin >> s3;
    cout << s3 << endl;

    return 0;
}

运行结果

说明:循环用cin输入,然后用Ctrl+Z退出循环,发现后面的cin不起作用。其原因是Ctrl+Z已使cin失效。可用cin.clear()修改cin状态标识符,使cin重新可用。

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

int main()
{
    string s1, s2, s3;
    while (cin >> s1)//对输入的字符串进行连接
    {
        s2 += s1;
    }
    cout << s2 << endl;

    cin.clear(); //修改cin状态标识符

    cout << "------------------------" << endl;
    getline(cin, s1);
    for (unsigned int i = 0; i < s1.size(); i++)
    {
        if (s1[i] != ' ')
        {
            s3 += s1[i];
        }
    }
    cout << s3 << endl;

    return 0;
}

运行结果

发布了77 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_34801642/article/details/103927910