Hay una solución más elegante.
Con std :: string puede usar resize() para asignar un búfer adecuadamente grande, y & s [0] para obtener un puntero al búfer interno.
En este punto, mucha gente buena saltará y gritará en la pantalla. Pero este es el hecho. Hace aproximadamente 2 años
el grupo de trabajo de la biblioteca decidió (reunión en Lillehammer) que al igual que para std :: vector, std :: string también debería tener formalmente, no solo en la práctica, un buffer contiguo garantizado.
La otra preocupación es strtok() aumenta el tamaño de la cadena. La documentación de MSDN dice:
Cada llamada a strtok modifica strToken insertando un carácter nulo después del token devuelto por esa llamada.
Pero esto no es correcto. En realidad, la función reemplaza la primera aparición de un carácter separador con \ 0. Sin cambios en el tamaño de la cuerda. Si tenemos esta cadena:
uno-dos --- tres - cuatro
vamos a terminar con
uno \ 0two \ 0 - tres \ 0 y cuatro
Así que mi solución es muy sencilla:
std::string str("some-text-to-split");
char seps[] = "-";
char *token;
token = strtok(&str[0], seps);
while(token != NULL)
{
/* Do your thing */
token = strtok(NULL, seps);
}
Leer la discusión sobre http://www.archivum.info/comp.lang.c++/2008-05/02889/does_std::string_have_something_like_CString::GetBuffer
Ver esta pregunta: ¿Es http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c/55680 – Ferruccio