c++ - getline 函数中的缓冲区清理
问题描述
我知道 cin.getline() 函数不会清理缓冲区,例如在程序下面的代码中跳过第 4 行:
char name[10];
char id[10];
std::cin >> name;
std::cin.getline(id,10);
std::cout << name << std::endl;
std::cout << id << std::endl;
输出(如果我输入“Meysam”作为名称变量):
Meysam
所以因为 cin.getline() 没有清理缓冲区,所以我们不能输入 id 变量,但是如果我们使用两个 cin.getline() 如下所示,我们可以输入名称和 id 变量。
char name[10];
char id[10];
std::cin.getline(name,10,'\n');
std::cin.getline(id,10,'\n');
std::cout << name << std::endl;
std::cout << id << std::endl;
这是输出(我们输入 Meysam 和 12345 作为名称和 ID):
Meysam
12345
但这是为什么呢?我的意思是因为 cin.getline() 没有清理缓冲区,我们应该能够输入 name 变量,但是程序应该跳过下一个用于 id 的 cin.getline(),因为缓冲区已经被填充以前的 cin.getline().NO? 我想知道我没有正确理解的地方谢谢。
解决方案
std::cin >> name;
将从输入读取直到找到分隔符,通常是空格或newline
字符,但分隔符将留在输入流中,因此下一次调用getline
读取newline
字符并返回空行,从而有效地清除id
变量。
第二个程序有效,因为getline
提取了newline
分隔符,因此下一次调用看不到它并等待输入。
您可以在cppreference上看到更好的解释(请参阅“注释”部分。)
推荐阅读
- android - 我需要结合使用 lambda 函数和列表理解
- python - 为图例的 Line2D 元素中的标记添加错误栏
- php - 无法在 docker php 7.3.5 中启用 php-ast
- neo4j - Neo4jRule :在 Neo4j 测试服务器中包含算法插件(例如 randomWalk)
- ms-access - 访问年龄范围查询不返回年龄小于 1
- node.js - 使用 IISNODE 间歇性地使用 IIS 中托管的节点 API 获取 net::ERR_CONNECTION_RESET
- jms - ActiveMQ 的重新交付时间很长
- jquery - 使用 FormData MVC 将文件和列表发布到 MVC 控制器
- ios - “在‘try’表达式中没有调用抛出函数”
- android - 最小化数据库的价值