如何正确使用 std::cin.get() 和 std::cin.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 << '\n';
    std::cout << "str: " << str << '\n';

}

许多 C++ 网站和论坛都在使用这种东西:

while(std::cin.peek() != '\n)
    ; do somthing
  • 但是在阅读了有关 C++ 入门的说明后,我感到很困惑。据说这些函数 get(),peek() 返回的是 int 而不是 char,所以我们不能将结果分配给一个字符,而是分配给一个 int

  • 据说字符先转换为unsigned char,然后提升为int

那么我该如何正确使用这些功能呢?

解决方法

所以我们不能将结果分配给一个字符,而是分配给一个整数

while(std::cin.peek() != '\n') 没有将 peek() 的结果分配给一个字符。它正在比较 char 和 int。这里 char 被隐式​​转换为 int 然后进行比较。感谢@M.M,这样使用更安全:while(std::cin.good() && std::cin.peek() != '\n')

https://www.learncpp.com/cpp-tutorial/implicit-type-conversion-coercion/