【问题标题】:getline(cin, var) not working!getline(cin, var) 不工作!
【发布时间】:2011-08-05 09:22:10
【问题描述】:

由于某些奇怪的原因,getline() 函数无法正常工作。我有我的程序循环通过递归(return main();)。第一次运行下面的代码,没问题。

cout << "Enter a phrase: ";
string user;
getline(cin, user);

但是,在调用递归之后,程序会跳过允许我输入的步骤。效果是字符串 user 为空。任何想法为什么?

谢谢。

【问题讨论】:

    标签: c++ string recursion getline


    【解决方案1】:

    在循环之前调用cin.clear() 清除所有标志。

    编辑:感谢@Xeo 的指出,还应该调用cin.ignore() 来丢弃换行符——它可能仍在缓冲区中......

    【讨论】:

    • 可能也需要cin.ignore,因为换行符仍在缓冲区中(至少这是我经常遇到的行为)。
    • 如果这是问题所在,解决方案可能是首先避免设置错误标志的条件。
    • 这是我的第一个,但 getline() 删除了分隔符(默认为 \n)——因此不需要忽略——唯一的原因(由于递归调用,UB 除外to main) 用于设置标志达到 EOF 或试图读取超过 string::max_size 个字符。
    【解决方案2】:

    对 main 的递归调用在 C++ 中没有明确定义(它在 C 中)。这可能是也可能不是您的问题的原因。

    【讨论】:

    • +1。令人惊讶的是,一个实际上禁止这样做的平台不会发出警告……但这正是它会导致的那种症状。 iostream 依赖于全局变量,当 main 重新进入时可能会重新初始化。
    • @Potatoswatter - 真的吗?怎么可能是这样?我可以理解在第一次调用main 之前会发生一些事情,但是后续调用怎么可能是这种情况——这只是函数调用?此外,使用不称为main 的正常递归函数进行测试,我冒着风险您会遇到完全相同的问题...
    • +1 完全正确...编译器在main() 的开头注入它喜欢的任何初始化代码/调用是合法的(这使得为其他入口点的平台创建 C++ 系统变得更加容易不能为可执行对象定义)。它很可能正在重新初始化 iostream 的静态变量(可能存在内存泄漏或损坏),或者它可能正如 Nim 所希望的那样,并且一个简单的 clear() 将起作用 - 但只有当递归对于在问题和之前的 I/O 操作实际上失败了。
    • 一些编译器用来使某些事情发生在 main 之前的技术是在 main 的开头插入代码。例如,这就是 CFront 使用的技术,这也是 C++ 不允许递归调用 main 的原因。 (但编译器确实会发出警告。)
    • @James,@Tony - 好了,今天学到了一些新东西...... :)
    猜你喜欢
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2019-10-21
    • 2014-12-06
    • 1970-01-01
    • 2012-01-10
    • 2015-05-06
    • 1970-01-01
    相关资源
    最近更新 更多