Поскольку strtok()
изменяет входную строку, вы сталкиваетесь с проблемами, когда не удается найти разделитель в функции getCents()
после вызова getDollars()
.
Обратите внимание, что strtok()
возвращает нольуказатель, когда не удается найти разделитель.Ваш код не проверяет, что strtok()
нашел то, что искал - что всегда рискованно.
Ваше обновление вопроса показывает, что вы узнали хотя бы о некоторых опасностях (пороках?) из strtok()
.Тем не менее, я бы предположил, что лучшее решение будет использовать только strchr()
.
Во-первых, мы можем заметить, что atoi()
в любом случае прекратит конвертацию в '.
', поэтому мы можем упростить getDollars()
на:
unsigned getDollars(const char *price)
{
return(atoi(price));
}
Мы можем использовать strchr()
- который не изменяет строку - чтобы найти '.'
и затем обработать текст после него:
unsigned getCents(const char *price)
{
const char *dot = strchr(price, '.');
return((dot == 0) ? 0 : atoi(dot+1));
}
Довольнонамного проще, я думаю.
Еще один гоча: предположим, что строка 26,6;вам придется работать усерднее, чем пересмотренный getCents()
, приведенный выше, чтобы получить 60 вместо 6. Кроме того, с учетом 26.650 он вернет 650, а не 65.