首页 > 解决方案 > C++ 中的 Ignore() 函数使用问题

问题描述

#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()and getline(cin, )

标签: c++arraysstringcingetline

解决方案


您使用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');

推荐阅读