何时以及为何需要使用.ignore()

文章背景

笔者写作业时遇到的

题目如下

设有若干个长度不超过100的字符串(含空格和tab字符),设计各字符串的输入、输出及按大小(按ASCII值)排序的函数,
主函数main中让用户输入字符串个数,再调用输入、排序及输出函数,完成各字符串的处理。

【输入形式】
3 (用户输入字符串个数)
What’s this?
How old are you?
What? (用户输入的三个字符串)
【输出形式】
How old are you?
What’s this?
What?

阅读本文前置知识

  • 了解vector的基本成员函数
  • 了解cin的基本成员函数

正文

做这道题笔者的思路是,程序分为两大模块:

  1. 输入模块
  2. 冒泡排序模块

最初的代码如下(含有bug)

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
    int nums;
    cin>>nums;			//获取字符串个数
    string input;		//未对string初始化,默认初始化为空字符串,input==""
    int nums_copy=nums;
    vector<string> container;
    while (nums_copy){
        getline(cin,input);
        container.push_back(input);
        nums_copy--;
    }
    int rounds=0;
    for (int i = 0; (i+1) <(nums-rounds) ; ++i) {
        for (int j = 0; j+1 <nums-rounds ; ++j) {
            if(container[j]>container[j+1]){
                swap(container[j],container[j+1]);
            }
        }
        rounds++;
    }
    for (int i = 0; i < nums; ++i) {
        cout<<container[i]<<endl;
    }
    return 0;
}


经单步调试后发现,在vs2019环境下,会出现如下问题

  1. vector<string>容器允许入栈只含有空白符的字符串以及空字符串"\n",""
  2. cin>>nums执行结束后,只有数字部分被cin读入nums,紧跟在数字部分后的,仍存在于输入流当中的\n未被第七行代码读入,当getline(cin,input)执行后,输入流缓存区当中的\n将被读入,又因为getline会舍弃换行符,因此getline读入一个空字符串,之后入栈,container[0]==""。导致最终只有nums-1个字符串入栈

需对第十二行代码进行改动,正确代码如下

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
    int nums;
    cin>>nums;
    string input;
    int nums_copy=nums;
    vector<string> container;
    while (nums_copy){
        getline(cin.ignore(numeric_limits<streamsize>::max(),'\n'),input);		//忽略缓存区的空字符串
        container.push_back(input);
        nums_copy--;
    }
    cout<<container[0];
    int rounds=0;
    for (int i = 0; (i+1) <(nums-rounds) ; ++i) {
        for (int j = 0; j+1 <nums-rounds ; ++j) {
            if(container[j]>container[j+1]){
                swap(container[j],container[j+1]);
            }
        }
        rounds++;
    }
    for (int i = 0; i < nums; ++i) {
        cout<<container[i]<<endl;
    }
    return 0;
}

另一种可行,但是时间复杂度较高的改动方法为

nums++,从而顺利入栈所有字符串(包括""),再利用vector::erase()删除第一个元素("")

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值