【问题标题】:Ignore() function usage issue in c++ [duplicate]C ++中的忽略()函数使用问题[重复]
【发布时间】:2020-08-08 19:49:19
【问题描述】:
#include <iostream>
#include <ios> 
#include <limits>

using namespace std;

int main() {
   int x;
   char str[80];
   cout << "Enter a number and a string:\n";
   cin >> x;
   cin.ignore('\n');

   cin.getline(str,80); 
   cout << "You have entered:\n";
   cout << x << endl;
   cout << str << endl;
}

我在使用忽略功能时遇到问题 cin.ignore('\n'); 导致输出我必须多次按 Enter 才能打印语句(以减少字符数),否则它会从输出中的字符串中删除一些初始字符(以防万一更多的字符)。像这些:

在使用 cin.ignore(); 时会产生正确的输出。

使用其中任何一个不一样吗'\n' 丢弃换行符,() 空括号也丢弃最后一个字符(或此处的换行符)。

另外,我们什么时候应该使用cin.getline() 和getline(cin, )?

【问题讨论】:

  • 请不要用文字的图片,只用文字。有足够的格式选项使它看起来不错。关于您的代码,作为像您这样的交互式程序的一般方法,请专门使用getline()。如果您需要一个整数,请仍然读取一行,然后解析该行。如您所见,在格式化 (&gt;&gt;) 输入和未格式化输入之间切换是不值得的。

标签: c++ arrays string cin getline


【解决方案1】:

您错误地使用了ignore()。

它有 2 个可选参数 - 最多 count 个要忽略的字符,以及一个要停止忽略的 delim 字符,按此顺序:

basic_istream& ignore( std::streamsize count = 1, int_type delim = Traits::eof() );

ignore() 将跳过字符,直到遇到 delim 或到达 count,以先发生者为准。

您将'\n' 传递给count 参数,而不是delim 参数。 '\n' 转换为整数时的数值为 10。所以你告诉 ignore() 跳过 10 个字符。

在您的第一个示例中,即6 之后的换行符,然后是接下来的 9 个字符 gautamgoy。因此,getline() 之后从 al 开始读取并在下一个换行符处结束。

在您的第二个示例中,即4 之后的换行符,然后是接下来的 6 个字符 grgzed,然后是接下来的 3 个换行符。因此,getline() 之后在下一个换行符处结束,因为没有要读取的字符。

在您的第三个示例中,不带参数调用 ignore() 将仅跳过 1 个字符,即 6 之后的换行符,将其余字符 gautam goyal 留给 getline() 读取到下一个换行符.

当忽略直到下一个换行符的字符时,无论有多少个字符,请改用:

#include <limits>

cin.ignore(numeric_limits<streamsize>::max(), '\n');

【讨论】:

  • @Remy_Lebeau 关于 cin.getline() 和 getline(cin, ) 之间区别的第二个问题。
  • @GautamGoyal 这只是使用 char[] 数组与 std::string 对象之间的区别
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
相关资源
最近更新 更多