2016-03-01 158 views
0
#include <iostream> 
#include <string> 
using namespace std; 
int main(){ 
    int a1,a2,a3,a4; 

cin>>a1>>a2>>a3>>a4; 
string a; 
getline(cin,a); 
return 0;} 

我有这段代码。我不能输入“a”的值。请帮助我C++ getline cin错误

+1

你是什么意思“无法输入”?任何错误? – songyuanyao

+0

只是当它涉及到输入,程序关闭 –

+0

你是如何输入它们的?我尝试了一个演示[这里](http://rextester.com/TGTZ9945)。 – songyuanyao

回答

2

您可以使用std::ws从输入流中丢弃前导空格。

#include <iostream> 
#include <string> 

int main() 
{ 
    int a1, a2, a3, a4; 
    std::cin >> a1 >> a2 >> a3 >> a4; 

    std::string a; 
    std::getline(std::cin >> std::ws, a); 

    return 0; 
} 

cin实际存储整数和在输入缓冲器中的'\n'

因此,当流量达到getline声明时,它只会得到'\n'


反正在数量上直接读取是有问题的:当cin呈现输入它无法处理,它进入失效状态。

它无法处理的输入保留在输入流中,并被忽略,直到“失败”状态被清除(std::cin.clear())。

所以,你应该检查,看看如果输入流是无效的(!std::cin):

std::cin >> a1; 
if (!std::cin) 
{  
    std::cin.clear(); 
    std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n'); 

    // Get the input again/handle the error 
} 
1

Good documentation like cppreference.com说明问题很清楚:当空格分隔的输入,例如后立即使用

int n; std::cin >> n;,getline消耗了 输入流上留下的末尾字符operator>>,并立即返回。

我想提出一种替代方案,而不是忽略剩余字符。您通常应该考虑一种编程风格,其中所有输入都是基于行的,其格式为std::getline。如果需要的话,个别行可以是tokenised,使用诸如std::istringstreamstd::stoi的工具。这允许您以比通过std::cin的状态标志更简单的方式实现错误输入的错误处理。

例如,在下面的示例程序中,当您尝试在第一行中输入少于或多于4个整数,或者其中一个整数不能被分析为整数时,则会得到一个确切的错误信息。重要的一点是,不是使用std::cin直接获取整数值,首先接收完整的std::string行,然后分割并分析该行。

#include <iostream> 
#include <string> 
#include <vector> 
#include <sstream> 
#include <stdexcept> 
#include <exception> 

// using just one of the many possible ways in C++ to tokenise a string: 
std::vector<std::string> tokenise(std::string const& line) 
{ 
    std::vector<std::string> tokens; 
    std::istringstream is(line); 
    std::string token; 
    while (std::getline(is, token, ' ')) 
    { 
     tokens.push_back(token); 
    } 

    return tokens; 
} 

std::vector<int> parse_four_integers(std::string const& line) 
{ 
    auto const tokens = tokenise(line); 

    if (tokens.size() != 4) 
    { 
     throw std::runtime_error("illegal token count: " + std::to_string(tokens.size())); 
    } 

    std::vector<int> result; 
    for (auto&& token : tokens) 
    { 
     try 
     { 
      result.push_back(std::stoi(token)); 
     } 
     catch (std::exception const&) 
     { 
      throw std::runtime_error("token " + token + " is not a valid integer"); 
     } 
    } 
    return result; 
} 

int main() 
{ 
    try 
    { 
     std::string line; 

     std::getline(std::cin, line); 
     auto const four_integers = parse_four_integers(line); 

     std::getline(std::cin, line); 

     for (auto&& integer : four_integers) 
     { 
      std::cout << integer << "\n"; 
     } 
     std::cout << line << "\n"; 
    } 
    catch (std::exception const& exc) 
    { 
     std::cerr << exc.what() << "\n"; 
    } 
}