从cin流中读取字符串并存储以空格分隔的值



实际上我想出了(临时)解决方案,但我仍然认为它可以做得更有效,但如何?我不是很熟悉流(还是c++初学者)。我的观点是使用std::getline()std::cin流读取行(我假设它只能作为字符串读取),所以我试图设置一些std::string::const_iterator并迭代我的字符串包含的每个字符,使用' '作为分隔符来区分我的字符串中的不同单词(值)。我将只读取两个用一个空格分隔的整数。

的例子:

输入:

2(例数)

10 20

30 40

结果:

在变量A中存储10,在变量B中存储20,在变量C中存储30…等等。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
int main()
{
    bool next;
    unsigned short int cases;
    long long m, n;
    std::vector<long long> vcases;
    std::string m_n_store;
    std::string m_n_read;
    std::cin >> cases;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
    for (int i = 0; i < cases; ++i)
    {
        next = false;
        std::getline(std::cin, m_n_read);
        for (std::string::const_iterator it = m_n_read.begin(); it != m_n_read.end(); ++it)
        {
            if (*it == ' ')
            {
                next = true;
                std::istringstream iss(m_n_store);
                iss >> m;
                vcases.push_back(m);
                m_n_store.erase();
            }
            if (!next) m_n_store.push_back(*it);
            else if (*it != ' ') m_n_store.push_back(*it);
            if (it == (m_n_read.end() - 1))
            {
                std::istringstream iss(m_n_store);
                iss >> n;
                vcases.push_back(n);
                m_n_store.erase();
            };
        }
    }
    for (int i = 0; i < vcases.size(); ++i)
    {
        std::cout << vcases[i] << 'n';
    }
}

c++流,默认情况下,用空格分隔输入操作。不需要遍历字符串并用空格字符分隔它。您可以使用std::istream_iterator和vector的范围构造函数:

std::vector<long long> mcases{std::istream_iterator<long long>{std::cin}, {}};

试试这个:

size_t pos = 0;
while ((pos = m_n_read.find(" ")) != std::string::npos) {
    std::istringstream iss(m_n_read.substr(0, pos));
    iss >> m;
    vcases.push_back(m);
    m_n_read.erase(0, pos + 1);
} 
if (m_n_read.size() > 0)
{
    std::istringstream iss(m_n_read);
    iss >> m;
    vcases.push_back(m);
}

相关内容

  • 没有找到相关文章

最新更新