摆脱白色空间(C )

Getting rid of white spaces (C++)

本文关键字:白色空间      更新时间:2023-10-16

我的代码允许用户输入数字,对其进行分类并按顺序输出。

示例输入: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;
}

我将使用 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在此代码中无效输入。如果愿意,除了逗号限制的数字外,还必须添加一些额外的代码来处理空格限制的数字。