【问题标题】:A real solution to the 'cin' and 'getline' issue真正解决“cin”和“getline”问题
【发布时间】:2014-06-22 17:32:29
【问题描述】:

当我不确定在 getline 之前是否会得到一个 cin 时,如何去掉前导的 ' ' 和 '\n' 符号?

例子:

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

cin.getline(s);

如果我在 getline 之前放一个 cin.ignore() ,我可能会丢失字符串的第一个符号,所以我唯一的选择是在每次使用 'cin >>' 之后放置它吗?因为当你在做一个大项目时,这不是很有效的方法。

还有比这更好的方法吗:

int a;
string s;

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

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

【问题讨论】:

  • 在没有看到您的确切输入的情况下不确定,但这可能有助于stackoverflow.com/questions/23047052/…
  • 不要混用 >>getline。始终使用getline。就目前而言,您的代码无论如何都被破坏了,因为您不检查 cin >> a 是否成功。

标签: c++ cin getline


【解决方案1】:

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

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

}

【讨论】:

    【解决方案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);
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 2021-03-24
      • 2014-12-06
      • 1970-01-01
      • 2016-01-13
      相关资源
      最近更新 更多