Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确使用std::cin.get()和std::cin.peek()的返回值?_C++_Iostream_Peek - Fatal编程技术网

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

那么,如何正确使用这些函数呢

所以我们不能将结果赋给char,而是赋给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