1. 预备知识:输入流与位置指针

当我们从键盘输入时,数据先存入输入缓冲区(一个队列)。
cin 对象内部维护一个读取位置指针,它指向缓冲区中下一个待读取的字符。
每次调用 cin >>cin.get()cin.getline() 等,指针都会根据读取规则向前移动。
关键点:不同函数对“终止字符”的

2. 第一大部分:逐个解析四种读取方式

2.1 cin.get() —— 读取一个字符(不跳过空白)

处理(丢弃或保留)决定了指针最终停在哪里

int ch = cin.get(); // 返回读取的字符的 ASCII 码(或 EOF)

  • 从输入流中提取一个字符(包括空格、换行符 \n、Tab 等空白字符)。

  • 读取后,位置指针向后移动一个字符。

  • 示例:

  • 2.2 cin.get(char &ch) —— 引用版本(有一个参数)

  • char ch;
    cin.get(ch);
  • 与第一种完全等效,只是通过引用返回结果。

  • 同样不跳过空白,且指针移动一位

  • 2.3 cin.get(char* s, int size, char delim) —— 读取字符串

  • char buffer[100];
    cin.get(buffer, 10, '\n');  10即为字符个数,'\n'即为终止字符
  • 读取最多 size-1 个字符,或遇到 delim 分隔符(默认为换行符 '\n')时停止——指针停留在 delim 的位置上(即 delim 是流中下一个将要被读取的字符)

  • 重要特性delim 字符不会被从流中提取(即它仍留在缓冲区中)。读取停止后,流的位置指针精确地停留在 delim 所在的位置,因此下一次读取操作将从 delim 开始读取。

  • 自动在末尾添加 '\0'

  • 如果一行输入超过缓冲区,后续操作容易出错。

  • 2.4 cin.getline(char* s, int size, char delim) —— 读取一行

  • cin.getline(buffer, 100, '\n');
  • 参数与 cin.get() 字符串版本相同。

  • 最大区别getline 会提取并丢弃终止字符(delim),即指针会越过 delim

  • 若有下一次继续的读取操作,指针从delim后开始!

  • 同样会自动添加 '\0'

  • 一句话总结:get 不提取终止符,getline 提取并丢弃终止符。

  • 3. 第二大部分:组合使用 —— 两道题目测测你的指针理解

    题目1:指针是否移动?

  • 此时指针仍指向 'x'
  • 这个呢?
  • 需注意!最多读取size-1(注意含有减一)个字符!因此读完ab,即在遇到x前,就停下了!
  • 题目2:getline 与 get 混合

  • 分析

  • 输入流原始内容:t e s t \n

  • cin.getline(buf1, 10, 't'):遇到第一个 't' 作为分隔符,提取并丢弃这个 't',所以 buf1 读到了 空字符串(因为分隔符在开头)。

  • cin.getline指针会后移一位!此时指针指向下一个字符 'e'

  • cin.get(buf2, 10, 't'):从 'e' 开始读,直到遇到下一个 't'(即输入中的第二个 't'),不提取该 't'。所以读到 "es"(只到第二个 t 之前)。

  • 输出:
    buf1 =(空)
    buf2 = es

4. 总结

函数 是否提取终止符 是否跳过空白 终止符处理(指针位置)
cin.get() 不适用 无终止符,读取一个字符,指针后移一位
cin.get(char&) 不适用 同上,指针会后移
cin.get(buf, size, delim) 终止符留在流中,指针停在终止符位置
cin.getline(buf, size, delim)

终止符被提取并丢弃,指针移到终止符之后(指针也会后移)特别提醒:读取的是size-1个字符

最后,一道综合题

........................................................................................................................................................

更多推荐