За пределами неправильной переменной с mktime - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь добавить дату ввода пользователя в существующую структуру времени, но получаю ошибку, которую не понимаю.Complier говорит мне, что день недели выходит за рамки, когда я пытаюсь изменить дату месяца.Код размещен ниже.

struct tm date;
int m, d, y, n;
char buffer[80];
printf("Enter a date in mm/dd/yyyy format.\n");
scanf("%d/%d/%d", &m, &d, &y);

date.tm_mday = d;
date.tm_mon = m;
date.tm_year = y - 1900;
mktime(&date);

printf("How many days would you like to advance this time?");
scanf("%d", &n);
date.tm_mday += n;
mktime(&date);
strftime(buffer, sizeof(buffer), "%c", &date);
printf("Your new date is %c", buffer);

1 Ответ

0 голосов
/ 03 декабря 2018

Проблемы

  • .tm_mon ожидаются месяцы с января 0-11.

    Обычно это означает вычитание 1 из ввода пользователя. @ dashboard

    // date.tm_mon = m;
    date.tm_mon = m - 1;
    

  • mktime(&date); считывает всех членов, кроме .tm_yday и .tm_wday, и только в наборах OP 3их.Лучше всего инициализировать всех членов с {0}, как мы знаем только о 7 других, и может быть больше. @ Джонатан Леффлер

  • Код не проверял возвращаемое значение mktime() на наличие ошибок.

  • Используйте "%s" для печати строки .Это означает, что OP не имеет хорошего компилятора с полностью включенными предупреждениями.Сэкономьте время и включите все предупреждения с помощью хорошего компилятора.

    char buffer[80];
    printf("Your new date is %c", buffer);  // Bad specifier
    

Соберите все это вместе.

// struct tm date;
struct tm date = {0}; // Initialize all
int m, d, y, n;
char buffer[80];

printf("Enter a date in mm/dd/yyyy format.\n");
if (scanf("%d/%d/%d", &m, &d, &y) != 3) {
  Handle_error();  
}


date.tm_mday = d;
// date.tm_mon = m;
date.tm_mon = m - 1;
date.tm_year = y - 1900;
date.tm_isdst = -1; // Set dst flag to: let mktime figure it out
if (mktime(&date) == -1) {
  Handle_error();  
}

printf("How many days would you like to advance this time?");
scanf("%d", &n);
date.tm_mday += n;
if (mktime(&date) == -1) {
  Handle_error();  
}

strftime(buffer, sizeof(buffer), "%c", &date);
printf("Your new date is %s", buffer);
...