Как минимум две проблемы с кодом.
1) Вы слишком много пишете в mydate
и mytime
.Исправление заключается либо в выделении большего объема памяти в структуре, то есть char mydate[10+1];
& char mytime[5+1];
.Или просто не пишите NULL
терминатор.Решение для этого, так как вы знаете размер заранее, используйте memcpy(mystruct->mydate, "01-01-1970", sizeof(mystruct->mydate));
или аналогичный memcpy(mystruct->mytime, "00:01", 5);
.
2) Вторая часть, распечатка, вы не показываете (подсказка).Поэтому, если вы не сохраняете NULL
-терминатор, то распечатка должна быть немного более деликатной, как показано в примере ниже.
// Possible dynamic max size
printf("date: %.*stime: %.*sThe\n",
(int) sizeof(mystruct->mydate), mystruct->mydate,
(int) sizeof(mystruct->mytime), mystruct->mytime);
// Fixed max size
printf("date: %.10stime: %.5sEnd\n",
mystruct->mydate,
mystruct->mytime);
В любом случае, распечатка будет:
date: 01-01-1970time: 00:01The
date: 01-01-1970time: 00:01End
Используемый printf
-синтаксис максимизирует длину напечатанной строки.
Кстати, ваша распечатка, 01-01-197000:01
, вероятно, является результатом того, что компилятор разместил макет памяти в struct mystruct
непосредственно друг за другом в памяти.Результирующий макет памяти эквивалентен
struct mystruct {
char my[15];
}
, где компилятор знает, что mydate
начинается со смещения 0, а mytime
начинается со смещения 10. Это, если вы заполнили свою структуру в порядкеВ вашем примере вы сначала получаете "01-01-1970\0"
, а затем "01-01-197000:01\0"
(где последняя запись выходит за рамки структуры).Таким образом, печать даты с помощью printf("%s", mystruct->mydate);
дает вывод вашей последовательности.
С другой стороны, если бы вы решили записать данные в обратном порядке,
strcpy(mystruct->mytime, "00:01");
strcpy(mystruct->mydate, "01-01-1970");
вывод
printf("date: %s, time: %sEnd\n", mystruct->mydate, mystruct->mytime);
будет
date: 01-01-1970, time: End
, так как вы перезаписали мой нулевой терминатор mydate
строковой копии.