stoi - strtoint c++
Dividir una cadena en enteros utilizando istringstream en C++ (2)
istringstream
usar istringstream
para dividir una cadena simple en una serie de enteros:
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main(){
string s = "1 2 3";
istringstream iss(s);
while (iss)
{
int n;
iss >> n;
cout << "* " << n << endl;
}
}
Y consigo:
* 1
* 2
* 3
* 3
¿Por qué el último elemento siempre sale dos veces? ¿Como arreglarlo?
Se publicará dos veces porque su bucle está mal, como se explica (indirectamente) en http://www.parashift.com/c++faq-lite/input-output.html#faq-15.5 ( while (iss)
no es diferente de while (iss.eof())
en este escenario).
Específicamente, en la iteración del tercer bucle, iss >> n
tiene éxito y obtiene su 3
, y deja la transmisión en buen estado. El bucle se ejecuta por cuarta vez debido a este buen estado, y no es hasta que falla el siguiente (cuarto) iss >> n
que la condición de bucle se interrumpe. Pero antes de que termine la cuarta iteración, todavía se emite n
... una cuarta vez.
Tratar:
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main()
{
string s = "1 2 3";
istringstream iss(s);
int n;
while (iss >> n) {
cout << "* " << n << endl;
}
}
Espero que esto ayude:
iss: 1 2 3
Iteración 1
iss: 1 2 3 (Inicialmente)
n = 1
iss: 2 3
// * 1 está impreso
Iteración 2:
iss: 2 3 (Inicialmente)
n = 2
iss: 3
// * 2 está impreso
Iteración 3
iss: 3
n = 3
iss: ''''
Iteración 4
iss: ''''
n no cambiado // Bandera configurada para eof de iss como ninguna entrada adicional de la secuencia
iss: ''''
Y como se menciona correctamente en la publicación anterior mientras que (iss) no es diferente de while (iss.eof ()).
Internamente, la función (istream :: operator >>) accede a la secuencia de entrada construyendo primero un objeto centinela (con noskipws establecido en falso [Esto significa que el espacio es separador y su lista será 1,2,3]). Luego (si es bueno [aquí eof no alcanzado]), llama a num_get :: get [Obtener el siguiente entero] para realizar tanto la extracción como las operaciones de análisis, ajustando las banderas de estado internas de la secuencia en consecuencia. Finalmente, destruye el objeto centinela antes de regresar.
Consulte: http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/