Tengo dos funciones auxiliares para separar cadenas en el formato de precios decimales, es decir. "23.00", "2.30"Problema con strtok y falla de segmentación
Considera:
char price[4] = "2.20";
unsigned getDollars(char *price)
{
return atoi(strtok(price, "."));
}
unsigned getCents(char *price)
{
strtok(price, ".");
return atoi(strtok(NULL, "."));
}
Ahora en que funciono el siguiente recibo un fallo de segmentación:
printf("%u\n", getDollars(string));
printf("%u\n", getCents(string));
Sin embargo, cuando ellos se ejecutan por separado sin uno después de la otros, funcionan bien ¿Que me estoy perdiendo aqui? ¿Tengo que hacer algún tipo de reinicio de strtok?
Mi solución:
Con el conocimiento sobre strtok he obtenido de la respuesta elegí a continuación, he cambiado la implementación de las funciones de ayuda para que copiar la cadena transferida en primer lugar, protegiendo así la cadena original y la prevención de este problema:
#define MAX_PRICE_LEN 5 /* Assumes no prices goes over 99.99 */
unsigned getDollars(char *price)
{
/* Copy the string to prevent strtok from changing the original */
char copy[MAX_PRICE_LEN];
char tok[MAX_PRICE_LEN];
/* Create a copy of the original string */
strcpy(copy, price);
strcpy(tok, strtok(copy, "."));
/* Return 0 if format was wrong */
if(tok == NULL) return 0;
else return atoi(tok);
}
unsigned getCents(char *price)
{
char copy[MAX_PRICE_LEN];
char tok[MAX_PRICE_LEN];
strcpy(copy, price);
/* Skip this first part of the price */
strtok(copy, ".");
strcpy(tok, strtok(NULL, "."));
/* Return 0 if format was wrong */
if(tok == NULL) return 0;
else return atoi(tok);
}
Gracias por la sugerencia, lo he llevado a bordo. – Chris