c++ string segmentation-fault strtok

C++ Dividir el problema de entrada



string segmentation-fault (2)

He escrito un blog hace 9 días exactamente para analizar tales entradas:

Y puede ver el resultado aquí para su entrada: http://ideone.com/qr4DA

Me están dando entrada en la forma de:

(8,7,15) (0,0,1) (0,3,2) (0,6,3) (1,0,4) (1,1,5) (2,1,6) (2,2,7) (2,5,8) (3,0,9) (3,3,10) (3,4,11) (3,5,12) (4,1,13) (4,4,14) (7,6,15)

donde tengo que recordar la cantidad de triples que hay. Escribí un programa de prueba rápido para intentar leer la entrada de cin y luego dividir la secuencia para obtener los números de la entrada. El programa no parece leer todas las líneas, se detiene después de (1,1,5) e imprime un 7 aleatorio después

Creé esta función de prueba rápida para una de las funciones que intento crear para mi tarea:

int main () { string line; char * parse; while (getline(cin, line)) { char * writable = new char[line.size() + 1]; copy (line.begin(), line.end(), writable); parse = strtok (writable," (,)"); while (parse != NULL) { cout << parse << endl; parse = strtok (NULL," (,)"); cout << parse << endl; parse = strtok (NULL," (,)"); cout << parse << endl; parse = strtok (NULL," (,)"); } } return 0; }

¿Alguien puede ayudarme a arreglar mi código o darme una muestra de trabajo?


Puedes usar esta simple función:

istream& read3(int& a, int& b, int& c, istream& stream = cin) { stream.ignore(INT_MAX, ''(''); stream >> a; stream.ignore(INT_MAX, '',''); stream >> b; stream.ignore(INT_MAX, '',''); stream >> c; stream.ignore(INT_MAX, '')''); return stream; }

Espera que la secuencia comience en a ( , por lo que omite cualquier carácter y se detiene después de la primera ( ve. Lee en un int en a que se pasa por referencia (por lo que el exterior a se ve afectado por esto) y luego lee y omite la primera coma que ve. Lave, enjuague, repita. Luego, después de leer la tercera entrada, omite el cierre ) , por lo que está listo para volver a hacerlo.

También devuelve un istream& que tiene el operator bool sobrecargado para devolver false cuando el flujo está en su extremo, que es lo que rompe el ciclo while en el ejemplo.

Lo usas así:

// don''t forget the appropriate headers... #include <iostream> #include <sstream> #include <string> int a, b, c; while (read3(a, b, c)) { cout << a << '' '' << b << '' '' << c << endl; }

Eso imprime:

8 7 15 0 0 1 0 3 2 0 6 3 1 0 4 1 1 5 2 1 6 2 2 7 2 5 8 3 0 9 3 3 10 3 4 11 3 5 12 4 1 13 4 4 14 7 6 15

Cuando le das tu opinión.

Como esta es una tarea, dejo que usted agregue el manejo de errores, etc.