неправильный результат при преобразовании нескольких строк в целые числа в c. Atoi не удаляет старые преобразования

#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;
}