Использование strtok в C для преобразования строки даты в целые - PullRequest
1 голос
/ 19 октября 2011

У меня проблемы с использованием функции strtok().Я кормлю эту дату 01/01/2000;мой ожидаемый результат: 1, 1, 2000;однако я просто получаю 1, 1, 1. Почему это?

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

Прежде всего, вы хотите использовать strtol вместо atoi (или sscanf, см. Ниже).Функция atoi небезопасна.

Во-вторых, strtok необходимо NULL вместо string:

pointerToDateStructure->day = atoi(strtok( string, delim));
pointerToDateStructure->month = atoi(strtok( NULL, delim)); /* NULL instead of string. */
pointerToDateStructure->year = atoi(strtok( NULL, delim)); /* See above. */

В-третьих, вы не проверяете значение, возвращаемое strtok.

Как примечание, вы уверены, что sscanf не может проанализировать ваши данные?

sscanf(str, "%d/%d/%d", &day, &month, &year)

РЕДАКТИРОВАТЬ Объяснение abelenky :

Функция strtok имеет состояние.Он «запоминает», над какой строкой он работал раньше, и, если вы передадите «NULL», он продолжит работать с той же самой строкой, обнаружив, где остановился раньше.Если вы передаете ему строковый параметр каждый раз, он начинается каждый раз с начала.

0 голосов
/ 19 октября 2011

sscanf(str, "%02d/%02d/%[^\n], &day, &month, &year) - один из самых простых вариантов, но вы должны быть точны с форматом; иначе все пойдет не так.

Если вы действительно хотите использовать strtok(), используйте его точно так, как сказал cnicutar, но будьте точны с проверкой на каждом шаге.

...