Проблема с strtok и segmentation fault

У меня есть две вспомогательные функции для разбиения строк в формате десятичных цен, т.е. «23.00», «2.30»

Подумайте об этом:

char price[4] = "2.20";

    unsigned getDollars(char *price)
    {
       return atoi(strtok(price, "."));
    }

    unsigned getCents(char *price)
    {
       strtok(price, ".");
       return atoi(strtok(NULL, "."));
    }

Теперь, когда я запускаю следующее, я получаю ошибку сегментации:

printf("%u\n", getDollars(string));
printf("%u\n", getCents(string));

Однако, когда я запускаю их по отдельности, один за другим, они работают нормально. Что мне здесь не хватает? Нужно ли мне делать какой-то сброс strtok ??

Мое решение:

Зная о strtok, полученную из ответа, который я выбрал ниже, я изменил реализацию вспомогательных функций, чтобы они копировали переданные в строку, таким образом защищая исходную строку и предотвращая эту проблему:

    #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);
}
6
задан Chris 8 May 2011 в 04:07
поделиться