C++:从cin流中读取字符串并存储以空格分隔的值
事实上,我想出了一个临时的解决办法,但我仍然认为它可以做得更有效,但如何做呢?我不太熟悉流,还是C++初学者。我的目的是使用std::getline从std::cin流中读取行。我假设它只能作为字符串读取,所以我尝试设置一些std::string::const_迭代器,并使用“”作为分隔符来迭代字符串包含的每个字符,以区分字符串中的不同单词值。我将只读取由单个空格分隔的两个整数 例如: 输入: 2.个案数目 1020 30 40 结果: 在变量A中存储10,在变量B中存储20,在变量C中存储30。。。等等C++:从cin流中读取字符串并存储以空格分隔的值,c++,string,algorithm,stream,cin,C++,String,Algorithm,Stream,Cin,事实上,我想出了一个临时的解决办法,但我仍然认为它可以做得更有效,但如何做呢?我不太熟悉流,还是C++初学者。我的目的是使用std::getline从std::cin流中读取行。我假设它只能作为字符串读取,所以我尝试设置一些std::string::const_迭代器,并使用“”作为分隔符来迭代字符串包含的每个字符,以区分字符串中的不同单词值。我将只读取由单个空格分隔的两个整数 例如: 输入: 2.个案数目 1020 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';
}
}
试试这个:
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);
}
默认情况下,C++流用空格分隔输入操作。不需要遍历字符串并用空格字符将其打断。您可以使用std::istream_迭代器和向量的范围构造函数: std::vector mcase{std::istream_迭代器{std::cin},{};