c++ - 去除空格 (C++)

标签 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;
}

最佳答案

我会使用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 在此代码中输入无效。如果您希望如此,除了以逗号分隔的数字之外,您还必须添加一些额外的代码来处理以空格分隔的数字。

关于c++ - 去除空格 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46187268/

相关文章:

c++ - 从 map 中检索值的问题(该值是一个 vector )

c++ - 在Visual Studio中创建Linux控制台应用程序时遇到问题

c++ - 如何使函数调用防弹?

java - 考虑到缺少EOF,如何从Java标准输入中读取?

java - 检查数据库中存在的大量字符串的有效方法

c++ - 按位小于或等于

c++ - 如何打印QImage的所有原始数据在内存中进行比较?

java japplet不接受输入

javascript - 防止字母的按键功能 - 如何在输入按键之前加载功能

arrays - 如果你可以在 7 次比较中对 5 个数字进行排序,那么如何在 10 次比较中对 6 个数字进行排序?