【问题标题】:C++ skipping the new line key?C++ 跳过换行键?
【发布时间】:2015-03-11 12:10:13
【问题描述】:

我试图让用户输入一些数据,然后将其存储在一个结构中,但是我不知道应该使用哪个函数以及有什么区别? cin 还是 getline()?无论我使用哪个功能,它似乎都需要'\n'键并使我的程序崩溃,但如果这是问题,我不是100%......因为它一直在崩溃。

我和他们都玩过,这就是我所拥有的。

string temp;
int id;

cout << endl << "Full name (last, first): ";
cin >> temp;
cin.ignore(1, '\n');
myData[fileSize] = parseName(temp);

cout << endl << "ID: ";
cin >> id;
myData[fileSize].id = id;

cout << endl << "Address: ";
cin >> temp;
temp.copy(myData[fileSize].address, temp.length(), 0);

变量 fileSize 就是数组当前所在的元素,函数 parseName 将名称拆分为最后一个和第一个。

我一直在阅读一些函数,例如 cin.ignore() 和 noskipws,但不知道如何使用它们。顺便说一句,用户应该输入数据的方式是“last, first”,后面有逗号和空格(这是解析函数要查找的内容)。

我也不确定地址部分是否是最好的方法,我有结构 myData.address 是一个字符数组,因为我不知道如何处理字符串。我仍然对 C++ 没有信心。感谢您的帮助。

编辑:如果我注释掉 ID 和地址部分,程序会自行循环 6 次,说我有一个无效条目(这是 main 的一部分),所以在我按下 Enter 后它会读取 6 或 7 个键。 如果我保持原样,这就是我得到的。

    Full name (last, first): terminate called after throwing an instance of 'std::ou
t_of_range'
  what():  basic_string::copy

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Process returned 3 (0x3)   execution time : 4.328 s
Press any key to continue.

【问题讨论】:

  • 当它崩溃时会发生什么?请将此设为MCVE
  • 你怎么知道它因为换行而崩溃?您是否测试过解析和其他所有内容?尝试隔离您的问题。在我看来,你有 3 个地方可能会爆炸。还有一个指南如何编写“为什么我的代码不起作用”问题。
  • 确保您的地址有足够的空间来保存您尝试复制到其中的地址。
  • 另外,只注释掉地址部分,然后运行它看看是否仍然出现该错误。
  • 添加了,在EDIT部分。

标签: c++ cin getline


【解决方案1】:

在这种情况下,您应该使用 cin.getline() 代替,而 cin.ignore 不是必需的。

Here is an examination of the two methods - std::cin.getline( ) vs. std::cin

另外,检查您的 parseName 函数并尝试在没有任何用户 I/O 的情况下单独测试它。

【讨论】:

  • 我通过硬编码名称检查了解析,它可以工作。我如何摆脱 '\n' 键呢?因为在此之前,我有一个 cout 说如果你想添加一个联系人,用户必须按“Y”键,我猜这个函数之前的新行是导致它崩溃的原因.我这样说是因为在稍微修改了代码之后,当我按“Y”添加联系人时,它会直接跳过添加姓名部分并返回到原始循环(所有这些地址和 ID 都被注释掉了) .
猜你喜欢
  • 2015-02-12
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2014-11-18
相关资源
最近更新 更多