如何避免cin.operator>>和getline之间的冲突?
How to avoid conflict between cin.operator>> and getline?
我只想读取n,然后使用getlinen次数:
#include <iostream>
using namespace std;
int main() {
int n;
cin>>n;
string film;
for(int i=0;i<n;i++){
getline(cin,film);
cout << film;
}
}
然而,第一部电影总是空荡荡的。亲眼看看。在这种情况下,如何使getline能够容忍默认的cin.operator>>?
将像std::cin >> n
这样的格式化输入与像std::getline(std::cin, film)
这样的未格式化输入混合的问题是,格式化输入在填充格式时停止,而未格式化输入不会跳过任何空格字符:您观察到的问题是读取n
时留下了一个换行符,该换行符被认为是第一个字符串的末尾。解决此问题的最佳方法是使用std::ws
操纵器跳过所有前导空白。此外,您应始终验证您的输入是否成功。也就是说,你的代码会变成这样:
#include <iostream>
int main() {
int n;
if (std::cin >> n) {
std::string film;
std::cin >> std::ws; // not really an input, hence uncheckedd
for (int i(0); i != n && std::getline(std::cin, film); ++i) {
std::cout << ''' << film << "'n";
}
}
else {
std::cout << "ERROR: failed to read the number of filmsn";
}
}
如果您真的需要在第一个film
的名称中有前导空格,那么您需要更加小心地忽略空格并在第一个换行处停止。那就是你应该使用而不是std::cin >> std::ws
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
std::numeric_limits
(在标头<limits>
中声明)的这种有趣使用确保了可以跳过任意数量的空格。您也可以使用一些固定的数字,比如10
,但当空格的跳过在这个数字之后停止时,您仍然可能会清空文件。此外,如果你真的在与文件数量相同的行上输入了第一个电影名称,它将被跳过。因此,我认为std::ws
的使用效果要好得多。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 构造函数和转换运算符之间的重载解析
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数