У меня есть две вспомогательные функции для разбиения строк в формате десятичных цен, т.е. «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);
}