#c #string #atoi
Вопрос:
Я пытаюсь извлечь день, месяц и год из даты, указанной для меня в виде строки. Я взял их в качестве подстроки при попрошайничестве, а затем пытаюсь преобразовать их в целочисленный тип. Первое целое число извлекается успешно, но второе и третье получают неправильные значения. Atoi сохраняет старые значения преобразования и добавляет к ним новое значение
Это мой код :
char day[2], month[2], year[4];
strncpy(day, date, 2);
strncpy(month, amp;date[3], 2);
strncpy(year, amp;date[6], 4);
int dayInt = atoi(day);
int monthInt = atoi(month);
int yearInt = atoi(year);
Комментарии:
1. размеры вашего массива недостаточно велики, чтобы вместить завершающий нулевой байт.
2. И
strncpy
не завершается нулем во всех случаях.3. Учитывайте
strptime
это при работе с датами.
Ответ №1:
В ваших строках нет завершающих нулевых байтов.
char day[3], month[3], year[5];
strncpy(day, date, 2);
day[2] = '';
strncpy(month, amp;date[3], 2);
month[2] = '';
strncpy(year, amp;date[6], 4);
year[4] = '';
int dayInt = atoi(day);
int monthInt = atoi(month);
int yearInt = atoi(year);
Но вы могли бы сделать это более просто, используя sscanf()
.
sscanf(date, "-/-/M", amp;dayInt, amp;monthInt, amp;yearInt);
/
При необходимости замените строку формата вашим фактическим разделителем.
Ответ №2:
Хотя вы можете использовать atoi
его для преобразования, он был бы более чистым в использовании sscanf
. Еще лучше было бы использовать strptime
.
#include <stdio.h>
#include <time.h>
int
main(void)
{
char *date = "20210210";
int day, month, year;
struct tm tm = {0};
char *end = "";
if( sscanf(date, "M--", amp;year, amp;month, amp;day) == 3 ){
printf("year: %d, month: %d, day: %dn", year, month, day);
}
end = strptime(date, "%Y%m%d", amp;tm);
if( end != NULL ){
year = tm.tm_year 1900; /* tm_year is offset from 1900 */
day = tm.tm_mday;
month = tm.tm_mon 1; /* tm_mon is 0 to 11 */
printf("year: %d, month: %d, day: %dn", year, month, day);
}
return 0;
}