char input = "20181204193456";
недействительно.Это одиночный символьный ввод, который инициализируется содержимым указателя, который указывает на строковый литерал "20181204193456"
.Это не то, что вы хотите.Вы хотите:
char input[] = "20181204193456";
Это символьный массив (читаемый как: 'string'), который инициализируется содержимым строкового литерала "20181204193456"
.Длина массива включает в себя символ завершения на конце, но без указания размера []
мы оставили его автоматически определяемым компилятором.
realtime(char input[20], char output[25]);
Это неверно и недопустимо.Вы хотите:
char outout[25];
realtime(input, output);
Сначала вы хотите зарезервировать 25 символов выходного пространства, чтобы иметь что-либо для записи.Затем вы хотите запустить функцию с первым входным параметром, а вторым - с выходным.
После исправления таких ошибок все будет в порядке.
Однако:
sprintf(output, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);
в порядке, но лучше использовать snprintf
:
snprintf(output, 25, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);
Без 25
и snprintf
, если длинаслучайно дольше это приведет к записи за размер массива.Здесь это может показаться избыточным, но лучше использовать его везде.
strncpy(arr, ..., len - 1)
arr[len] = '\0'
sprintf(... "%s", arr);
все в порядке.Но вы можете просто:
strlcpy(arr, ..., len)
sprintf(... "%s", arr);
или даже лучше:
sprintf(... "%.*s", len, arr);
, поэтому вся функция просто:
char realtime(char input[20], char output[25]){
snprintf(output, 25, "%.4s-%.2s-%.2sT%.2s:%.2s:%.2s",
input, input + 4, input + 6,
input + 8, input + 10, input + 12);
}