1. 输入终止条件
-
cin >> str
-
使用提取运算符
>>
,遇到空白字符(空格、制表符、换行符)时停止读取。 -
输入
"Hello World"
时,只会读取"Hello"
,剩余内容留在输入缓冲区。 -
不包含空格,且不会丢弃终止符(如换行符仍留在缓冲区)。
-
-
cin.getline(str, 100)
-
读取字符直到遇到换行符(默认)或达到指定长度(此处为
99
字符,第100
位留给空终止符\0
)。 -
输入
"Hello World"
时,完整读取整行(包括中间的空格)。 -
包含空格,但丢弃换行符(缓冲区中不再保留)。
-
2. 缓冲区处理
-
cin >> str
-
若输入内容包含换行符,换行符会保留在缓冲区,可能导致后续输入操作异常。例如:
cpp
复制
cin >> str; // 用户输入 "Hello\n" cin.getline(str2, 100); // 直接读到空字符串(因缓冲区残留的 `\n`)
-
-
cin.getline(str, 100)
-
读取后会主动丢弃换行符,确保后续输入不受残留字符影响。
-
3. 安全性
-
cin >> str
-
若输入的字符数超过目标数组大小(如
char str[10]
),会导致缓冲区溢出,引发未定义行为(如程序崩溃)。 -
需手动检查输入长度,或改用
std::string
。
-
-
cin.getline(str, 100)
-
通过第二个参数显式限制最大读取字符数(此处最多读
99
字符),避免溢出风险,更安全。
-
4. 适用场景
-
cin >> str
-
适合读取无空格的单个单词(如用户名、数字)。
-
示例:
cpp
复制
int age; cin >> age; // 正确读取整数
-
-
cin.getline(str, 100)
-
适合读取含空格的整行文本(如句子、地址)。
-
示例:
cpp
复制
char address[100]; cin.getline(address, 100); // 读取完整地址(可能包含空格)
-
5. 其他注意事项
-
与
std::string
的getline
对比-
cin.getline(str, 100)
用于 C风格字符数组(char[]
)。 -
std::getline(cin, str)
用于std::string
对象,更灵活且无需指定长度。 -
示例:
cpp
复制
std::string line; getline(cin, line); // 安全读取任意长度文本(自动管理内存)
-
-
错误处理
-
cin.getline()
可通过cin.fail()
检查是否因达到最大长度而截断输入。
-
总结
特性 | cin >> str | cin.getline(str, 100) |
---|---|---|
终止条件 | 空格/换行符 | 换行符或指定长度 |
包含空格 | 否 | 是 |
缓冲区残留换行符 | 是 | 否 |
安全性 | 可能溢出 | 显式限制长度,更安全 |
适用场景 | 单个单词(无空格) | 整行文本(含空格) |
根据需求选择合适的方法:需要读取整行文本时用 cin.getline
,处理无空格内容时用 `cin >>。