小学生 C++ 字符串输入详解 gets、fgets、cin.getline 到底有什么区别?
作者:野牛程序员:2026-01-18 08:37:53GESP阅读 2021
小学生 C++ 字符串输入详解 gets、fgets、cin.getline 到底有什么区别?
小学生 C++ 字符串输入详解
gets、fgets、cin.getline 到底有什么区别?
在 C++ 学习中,经常需要输入一整行文字,比如:
输入一个单词
判断是不是回文串
把一句话倒过来输出
这时就会用到字符串输入函数。常见的有三种:
getsfgetscin.getline
如果不了解它们的区别,程序很容易看起来对,其实结果错。
一、什么是“读一行字符串”
所谓“读一行”,指的是:
👉 从键盘开始读
👉 一直读到回车键为止
👉 把文字放进字符数组里
例如输入:
aba
目标结果是数组中只存:
a b a \0
二、gets —— 最好理解,但最不安全
1️⃣ 示例代码
char s[100]; gets(s);
2️⃣ 实际效果
输入:
aba
数组内容:
a b a \0
3️⃣ 优点(适合理解)
写法最简单
不会把回车存进去
很符合直觉
4️⃣ 缺点(非常严重)
不管数组多大,都会一直读
输入太长会把内存弄乱
新版 C++ 已经禁止使用
5️⃣ GESP 使用建议
⚠️ 只用于理解字符串
❌ 不建议在正式代码中使用
三、fgets —— 最容易出“隐藏错误”
1️⃣ 示例代码
char s[100]; fgets(s, 100, stdin);
2️⃣ 看起来没问题,其实有坑
输入:
aba
数组中实际存的是:
a b a \n \0
⚠️ 回车符 \n 也被存进去了
3️⃣ 会导致什么问题?
strlen(s)比想象多 1回文判断失败
反转字符串多出奇怪字符
4️⃣ 正确处理方法(考试必会)
int len = strlen(s);
if (s[len - 1] == '\n') {
s[len - 1] = '\0';
}5️⃣ 使用总结
✅ 安全
⚠️ 必须记得处理换行符
⚠️ 初学阶段容易犯错
四、cin.getline —— 最推荐的方法 ⭐
1️⃣ 示例代码
char s[100]; cin.getline(s, 100);
2️⃣ 输入效果最理想
输入:
aba
数组内容:
a b a \0
3️⃣ 为什么特别适合小学生
不会读入回车
自动处理结尾
写法清楚
不容易出错
4️⃣ 使用总结
✅ GESP 首选
✅ 教学、考试都合适
✅ 几乎不会踩坑
五、三种方式对比一眼看懂
| 输入方式 | 安全 | 会读回车 | 推荐程度 |
|---|---|---|---|
| gets | ❌ | 否 | ❌ |
| fgets | ✅ | 是 | ⚠️ |
| cin.getline | ✅ | 否 | ✅ |
六、GESP 考试实用建议(重点)
✅ 推荐做法
输入一整行字符串:
cin.getline做回文、反转、统计字符:优先用
cin.getline看到 fgets:第一时间检查有没有处理
\n
❌ 常见扣分原因
忘记
\0多算一个字符
回文判断始终是 NO
输出多一个空行或奇怪符号
七、一句话记忆法(非常重要)
gets:简单但危险
fgets:安全但多一个回车
cin.getline:安全又省心
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

