解决'cin'和'getline'问题的真正解决方案

时间:2014-05-06 07:55:22

标签: c++ cin getline ignore

如何摆脱领先的' '和' \ n'当我不确定我会在获取线之前得到一个cin时的符号?

示例:

int a;
char s[1001];
if(rand() == 1){
    cin >> a;
}

cin.getline(s);

如果我在getline之前放置了一个cin.ignore(),我可能会丢失该字符串的第一个符号,所以在我每次使用&c;>>&#39后我唯一的选择就是它; ?因为当你在一个大项目上工作时,这不是一个非常有效的方法。

有没有比这更好的方法:

int a;
string s;

if(rand() == 1){
    cin >> a;
}

do getline(cin, s); while(s == "");

2 个答案:

答案 0 :(得分:2)

像这样:

std::string line, maybe_an_int;

if (rand() == 1)
{
    if (!(std::getline(std::cin, maybe_an_int))
    {
        std::exit(EXIT_FAILURE);
    }
}

if (!(std::getline(std::cin, line))
{
    std::exit(EXIT_FAILURE);
}

int a = std::stoi(maybe_an_int);    // this may throw an exception

您可以通过几种不同的方式解析字符串maybe_an_int。您还可以使用std::strtol或字符串流(在与第一个if块相同的条件下):

    std::istringstream iss(maybe_an_int);
    int a;
    if (!(iss >> a >> std::ws) || iss.get() != EOF)
    {
        std::exit(EXIT_FAILURE);
    }

您当然可以更优雅地处理解析错误,例如通过在循环中运行整个事物直到用户输入有效数据。

答案 1 :(得分:0)

空格字符和换行符都被标准IOStream分类为空格。如果要将格式化的I / O与未格式化的I / O混合,并且需要清除剩余空白流,请使用std::ws操纵器:

if (std::getline(std::cin >> std::ws, s) {

}