【发布时间】:2021-02-15 01:30:46
【问题描述】:
我一直这样使用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++ 网站和论坛使用这样的东西:
while(std::cin.peek() != '\n)
; do somthing
-
但是在阅读了关于 C++ 入门的注释后,我感到很困惑。据说那些函数
get(), peek()返回一个int而不是char所以我们不能将结果分配给一个char,而是一个int。 -
据说那里的字符首先转换为
unsigned char,然后提升为int。
那么我该如何正确使用这些功能呢?
【问题讨论】:
-
在内部,
peek调用char_traits<char>::to_int_type将从流中读取的char值转换为int。人们一直在编写像你这样的代码,但令我惊讶的是,我无法在标准中找到保证to_int_type('\n') == int('\n')的要求,例如。我真诚地希望我是错的——当然我不想每次都写using Traits = std::char_traits<char>; Traits::eq_int_type(std::cin.peek(), Traits::to_int_type('\n'))。 -
原始代码很差,因为它在一个分支中消耗了整行,在另一个分支中消耗了部分行,因此无法正确输入下一段
-
@L.F.:你的评论很有用。请添加答案。