この質問は過去に何度か尋ねられたかもしれないことを理解していますが、私は関係なく続けます。
キーボード入力から数字の文字列を取得するプログラムがあります。数字は常に「66 33 9」という形式になります。基本的に、すべての数字はスペースで区切られ、ユーザー入力には常に異なる量の数字が含まれます。
すべてのユーザーが入力した文字列の数字の量が一定であれば、「sscanf」を使用しても機能することを知っていますが、これは私には当てはまりません。また、私はC++を初めて使用するため、charの配列よりも「文字列」変数を扱うことを好みます。
行全体を読み、それを入力として解析したいとします。そこで、最初に次の行を取得します。
std::string input;
std::getline(std::cin, input);
それをstringstream
に入れます:
std::stringstream stream(input);
解析する
while(1) {
int n;
stream >> n;
if(!stream)
break;
std::cout << "Found integer: " << n << "\n";
}
含めることを忘れないでください
#include <string>
#include <sstream>
C++ String Toolkit Library(Strtk) には、問題に対する次の解決策があります。
#include <iostream>
#include <string>
#include <deque>
#include <algorithm>
#include <iterator>
#include "strtk.hpp"
int main()
{
std::string s = "1 23 456 7890";
std::deque<int> int_list;
strtk::parse(s," ",int_list);
std::copy(int_list.begin(),
int_list.end(),
std::ostream_iterator<int>(std::cout,"\t"));
return 0;
}
より多くの例を見つけることができます ここ
#include <string>
#include <vector>
#include <iterator>
#include <sstream>
#include <iostream>
int main() {
std::string input;
while ( std::getline( std::cin, input ) )
{
std::vector<int> inputs;
std::istringstream in( input );
std::copy( std::istream_iterator<int>( in ), std::istream_iterator<int>(),
std::back_inserter( inputs ) );
// Log process:
std::cout << "Read " << inputs.size() << " integers from string '"
<< input << "'" << std::endl;
std::cout << "\tvalues: ";
std::copy( inputs.begin(), inputs.end(),
std::ostream_iterator<int>( std::cout, " " ) );
std::cout << std::endl;
}
}
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
using namespace std;
int ReadNumbers( const string & s, vector <int> & v ) {
istringstream is( s );
int n;
while( is >> n ) {
v.Push_back( n );
}
return v.size();
}
int main() {
string s;
vector <int> v;
getline( cin, s );
ReadNumbers( s, v );
for ( int i = 0; i < v.size(); i++ ) {
cout << "number is " << v[i] << endl;
}
}
// get string
std::string input_str;
std::getline( std::cin, input_str );
// convert to a stream
std::stringstream in( input_str );
// convert to vector of ints
std::vector<int> ints;
copy( std::istream_iterator<int, char>(in), std::istream_iterator<int, char>(), back_inserter( ints ) );
こちら スペースに沿って文字列を文字列に分割する方法。その後、それらを1つずつ処理できます。
符号なしの値の一般的な解決策(接頭辞「-」での処理には余分なboolが必要です):
template<typename InIter, typename OutIter>
void ConvertNumbers(InIter begin, InIter end, OutIter out)
{
typename OutIter::value_type accum = 0;
for(; begin != end; ++begin)
{
typename InIter::value_type c = *begin;
if (c==' ') {
*out++ = accum; accum = 0; break;
} else if (c>='0' && c <='9') {
accum *= 10; accum += c-'0';
}
}
*out++ = accum;
// Dealing with the last number is slightly complicated because it
// could be considered wrong for "1 2 " (produces 1 2 0) but that's similar
// to "1 2" which produces 1 0 2. For either case, determine if that worries
// you. If so: Add an extra bool for state, which is set by the first digit,
// reset by space, and tested before doing *out++=accum.
}
strtoken
を試して、最初に文字列を分離してから、各文字列を処理します。