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.