strtoint stoi parse ejemplos convertir conversion c++ stl istringstream

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/