c++ - seguidores - Convertir cadena que contiene varios números en enteros
hashtags para instagram para tener muchos likes 2018 (8)
La biblioteca de C ++ String Toolkit (Strtk) tiene la siguiente solución a su problema:
#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;
}
Más ejemplos se pueden encontrar Here
Me doy cuenta de que esta pregunta puede haber sido hecha varias veces en el pasado, pero voy a continuar independientemente.
Tengo un programa que va a obtener una serie de números de entrada de teclado. Los números siempre estarán en el formato "66 33 9". Esencialmente, cada número se separa con un espacio, y la entrada del usuario siempre contendrá una cantidad diferente de números.
Soy consciente de que usar ''sscanf'' funcionaría si la cantidad de números en cada cadena ingresada por el usuario fuera constante, pero este no es el caso para mí. Además, como soy nuevo en C ++, prefiero tratar con variables de ''cadena'' en lugar de matrices de caracteres.
Pruebe strtoken
para separar primero la cuerda, luego tratará con cada cuerda.
Solución genérica para valores sin signo (lidiar con el prefijo ''-'' toma un bool extra):
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.
}
Supongo que quiere leer una línea completa y analizarla como entrada. Entonces, primero toma la línea:
std::string input;
std::getline(std::cin, input);
Ahora pon eso en una stringstream
:
std::stringstream stream(input);
y analizar
while(1) {
int n;
stream >> n;
if(!stream)
break;
std::cout << "Found integer: " << n << "/n";
}
Recuerda incluir
#include <string>
#include <sstream>
Aquí es cómo dividir su cadena en cadenas a lo largo de los espacios. Luego puedes procesarlos uno por uno.
#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 ) );