C++中的cin、cin.get()、getline()

cin对象详解

int main() {
    int a, b;
    while (cin >> a >> b) { // 注意 while 处理多个 case
        cout << a + b << endl;
    }
    // cin >> a >> b;
    // cout << a + b << endl;
}

cin只有得到换行符才会开始从缓冲区读取
cin读取的时候,忽略遇到第一个字符前的分隔符,逐个读取
以上代码需注意:

  • 缓冲区的数据输入后(例如“ fd 5 4 3 6 ”),由回车结束,然后cin开始读取
  • cin从缓冲区读取数据,忽略缓冲区最前面的空格、tab、回车等分隔符
  • 在此后读取缓冲区的数据,直到遇到第一个分隔符,则第一个数据读取完毕
  • cin可以连续读取,这里cin了a后又遇到>>b,所以之后继续忽略分隔符,读取下一个数据(这时候a已经获得取值,b还没有),此时会检查a的数据类型,不符合则返回false,从而退出while循环)
  • (这里就是a=fd,b=未知,退出循环)
  • 如果此处数据符合要求,没有退出while循环,则继续在缓冲区中读取得(a=4,b=3,打印7)
  • 继续读取
  • (a=6,然后缓冲区没有数据【只有空格,是分隔符】,等待输入)
  • 如果这里a不是6,而是字符
  • 那么由于这里a的类型错误,返回false,while循环退出,不会再等待输入b

cin.get()函数

int main()
{
    int cur_sum = 0;
    int x;
    while (cin >> x)
    {
        cur_sum += x;
        if (cin.get() == '\n')
        {
            cout << cur_sum << endl;
            cur_sum = 0;
        }
    }

    return 0;
}

以上代码是一个循环,用于从标准输入(键盘)读取一系列整数,并在每行输入结束后(通过cin.get()判断)输出当前行的累加和。

  • cin.get() 是 C++ 标准库中用于从标准输入(通常是键盘)读取单个字符的函数
  • if (cin.get() == '\n'): 在读取完一个整数后,使用 cin.get()函数尝试读取一个字符。如果读取的字符是换行符\n,则表示当前行输入结束。

getline()函数

#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream> // Include this header for stringstream

int main() {
    std::string input;
    while (getline(std::cin, input)) { // 逐行读取输入
        std::vector<std::string> strs; // 存储分隔后的字符串
        std::string str; // 用于临时存储每个分隔的字符串
        std::stringstream ss(input); // 用于分隔字符串的字符串流

        // 分隔逗号分隔的字符串并存储在 strs 向量中
        while (getline(ss, str, ',')) {
            strs.push_back(str);
        }

        // 对分隔后的字符串进行排序
        std::sort(strs.begin(), strs.end());

        // 输出排序后的字符串
        for (auto& str : strs) {
            std::cout << str << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

以上代码是一个用于从标准输入逐行读取逗号分隔的字符串,然后对每行的字符串进行排序并输出的程序。

解释步骤:

  1. getline(std::cin, input): 这一行通过 getline 函数从标准输入中逐行读取输入并存储在 input 字符串中。循环会一直进行,直到达到文件结束或遇到错误。

  2. std::vector<std::string> strs;: 在每次循环迭代开始时,创建一个空的字符串向量 strs 用于存储分隔后的字符串。

  3. std::string str;: 这是一个临时的字符串变量,用于在分隔字符串时暂存每个分隔的部分。

  4. std::stringstream ss(input);: 使用 std::stringstream 对象 ss,将刚刚读取的 input 字符串转换为一个字符串流,这样我们就可以方便地分隔其中的内容。

  5. while (getline(ss, str, ',')) { ... }: 这个循环通过 getline 函数从 ss 字符串流中逐个读取以逗号为分隔符的部分,将每个部分存储在 str 中,然后将其推入 strs 向量中。

  6. std::sort(strs.begin(), strs.end());: 使用 std::sort 函数对 strs 中的字符串进行排序,使其按字母顺序排列。

  7. 输出排序后的字符串:使用循环遍历 strs 向量中的每个字符串,并将其输出到标准输出。

  8. std::cout << std::endl;: 在每次内部循环结束后,换行以准备处理下一行输入。

getline()函数详解

getline 是 C++ 标准库中的一个函数,用于从输入流中读取一行文本。它的函数签名如下:

istream& getline(istream& is, string& str, char delim = '\n');

这个函数的目的是从输入流(如标准输入、文件流等)读取文本,直到遇到指定的分隔符(默认是换行符 \n)为止,然后将读取的文本存储在指定的字符串 strgetline 函数的返回值是输入流对象的引用,通常是 cin 或文件流对象。

下面是关于 getline 函数的详细说明:

参数

  • is:表示输入流对象(例如 cin 或文件流)。
  • str:用于存储读取的文本的字符串对象的引用。
  • delim可选参数,表示分隔符,默认为换行符 \n。当读取到该字符时,读取操作会停止。

getline()函数注意事项

#include <iostream>
#include <vector>
#include <string>

int main() {
    int t;
    std::cin >> t;
    std::cin.ignore(); // 消耗换行符

    std::vector<std::string> a;
    for (int i = 0; i < 2 * t; ++i) {
        std::string temp;
        std::getline(std::cin, temp);
        a.push_back(temp);
    }

    for (const auto& str : a) {
        std::cout << str << std::endl;
    }

    return 0;
}

以上代码,getline之前必须加入std::cin.ignore();忽略输入t后的换行符。否则在读取 t 后,输入缓冲区中还有一个换行符(\n)残留,而在之后的 getline 中,第一个 getline读取了这个空行,导致a[0]为空

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容