C++ 如何正确使用std::cin.get()和std::cin.peek()的返回值?
我总是这样使用C++ 如何正确使用std::cin.get()和std::cin.peek()的返回值?,c++,iostream,peek,C++,Iostream,Peek,我总是这样使用peek(),get(): int main(){ std::string str; int value{}; if(std::isdigit(std::cin.peek())) std::cin >> value; else std::getline(cin, str); std::cout << "value : " << value <<
peek(),get()
:
int main(){
std::string str;
int value{};
if(std::isdigit(std::cin.peek()))
std::cin >> value;
else
std::getline(cin, str);
std::cout << "value : " << value << '\n';
std::cout << "str: " << str << '\n';
}
-
阅读C++注释后,我感到困惑。据说那些函数
get(),peek()
返回的是int
而不是char
,因此我们不能将结果赋给char,而是赋给int
无符号字符
,然后升级为int
while(std::cin.peek()!='\n')
未将peek()
的结果分配给字符。它比较一个字符和一个整数。在这里,字符被隐式转换为一个整数,然后进行比较。感谢@M.M,这样使用它更安全:while(std::cin.good()&&std::cin.peek()!='\n')
在内部,
peek
调用将从流中读取的char
值转换为int
。人们一直在编写类似于您的代码,但我感到惊讶的是,我无法在标准中找到保证为int类型('\n')==int('\n')
的要求。我真诚地希望我是错的——当然我不想用Traits=std::char\u Traits编写;Traits::eq_int_type(std::cin.peek(),Traits::to_int_type('\n'))
每次。原始代码很差,因为它在一个分支中占用整行,在另一个分支中占用部分行,因此无法进行下一段输入correctly@L.F.:你的评论很有用。请添加一个答案。@Maestro我将其作为一个问题发布:用法不好,因为如果输入有一个错误,“它只是比较一个字符和一个int”没有区别,它会给出一个无限循环,因为在这两种情况下,比较的字符或分配给的字符都将升级为int
。如果“它很好”,那么为什么peek()
和get()
返回int
而不是char
?标准库实现人员非常明智,因为无法从这些函数返回文件结尾字符。因为它的值超出了字符范围。将超出字符范围的值赋给有符号字符会导致有符号字符溢出,这是一种未定义的行为。@M.M:您能解释更多吗?@Maestro如果调用返回EOF,循环将如何结束?
while(std::cin.peek() != '\n)
; do somthing