【C++输入流】深入理解 get 与 getline:终止字符与指针移动的那些坑
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个字符 |
最后,一道综合题

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

更多推荐
所有评论(0)