摆脱空白(C ++)

时间:2017-09-13 00:54:35

标签: c++ input logic

我的代码允许用户输入数字,对其进行排序,然后按顺序输出。

示例输入:25,1,3-6
示例输出:1,3,4,5,6,25

但是,当用户输入类似2 5,1,3-6的内容时,如果3 - 6这样的情况下有空格,则该程序无法正常工作。

我使用cin>>ws;试图摆脱空白,但它无法正常工作。

以下是与此问题相关的代码部分(我还没有包含其他一些功能,除非它们似乎是问题的根源):

#include <iostream>     
#include <string>      
#include <cctype>     
#include <vector>

using namespace std;

void get_nums(vector<int>& num_vec);

int main () 
{
    int num1;
    int num2;
    cout << "\n Please, enter your HW: ";
    vector<int> num_vec;
    cin>>ws;
    cout.flush(); 
    do
    {
        cin>>ws;
        cin>>num1; 
        num_vec.push_back(num1);
        if(cin.peek() == ',')
        {       
            cin.ignore();
        }
        else if(cin.peek() == '-')
        {
            cin.ignore();
            cin>>num2;
            for(++num1; num1<=num2; num1++)
            {
                num_vec.push_back(num1);
            } 
            if(cin.peek() == ',')
            {
                cin.ignore();
            }       
        }
    }
    while (cin.peek() != '\n');

    cout<< "\n Do Problems: ";
    for(int z=0; z<num_vec.size(); z++)
    {
        if(z+1==num_vec.size())
        {
            cout<<num_vec[z];   
        }
        else if(z+2==num_vec.size())
        {
            cout<<num_vec[z]<<",and ";
        }
        else
        {
            cout<<num_vec[z]<<", ";
        }   
    }

    return 0;
}

1 个答案:

答案 0 :(得分:2)

我会使用std::getline()一次性读取用户的整个输入,然后使用std::istringstream来解析它,例如:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>

void get_nums(std::vector<int> &num_vec)
{
    std::string line, tokens;

    std::getline(std::cin, line);
    std::istringstream input(line);

    while (std::getline(input, tokens, ','))
    {
        std::istringstream values(tokens);
        int num;

        if (!(values >> num))
            continue;

        values >> std::ws;
        char ch = values.peek();

        if (ch == '-')
        {
            values.ignore();

            int num2;
            if (!(values >> num2))
                continue;

            while (num <= num2)
                num_vec.push_back(num++);
        }
        else if (ch == std::char_traits<char>::eof())
            num_vec.push_back(num);
    }
}

int main()
{
    std::vector<int> num_vec;

    std::cout << "\n Please, enter your HW: " << std::flush;
    get_nums(num_vec);

    if (!num_vec.empty())
    {
        std::sort(num_vec.begin(), num_vec.end());

        std::cout << "\n Do Problems: ";

        std::cout << num_vec[0];

        for(int z = 1; z < num_vec.size(); ++z)
        {
            std::cout << ", ";

            if ((z+1) == num_vec.size())
                std::cout << "and ";

            std::cout << num_vec[z];
        }
    }
    else
        std::cout << "\n No Input! ";

    return 0;
}

输入:25,1,3-6
输出:1,3,4,5,6,25

输入:25,1,3 - 6
输出:1,3,4,5,6,25

输入:2 5, 1 , 3- 6
输出:1,3,4,5,6 1

1 2 5在此代码中无效输入。如果你想要它,你将不得不添加一些额外的代码来处理空格分隔的数字以及逗号分隔的数字。