2016-09-19 10 views
2

У меня есть 14-значная строка с этими данными 20161909132409, и я хочу преобразовать ее в этот формат YYYY-dd-mm hh:mm:ss, поэтому он выглядит так: 2016-19-09 13:24:09, но я не знаю, как это сделать, может кто-нибудь мне помочь с кодом, пожалуйста?Преобразование строки в определенный формат даты

char * strA = "00000000000000", * strB = "-", strC[50]; 
    int x = 4; 
    strncpy(strC,strA,x); 
    strC[x]= '\0'; 
    strcat(strC,strB); 
    strcat(strC,strA+x); 
    printf("%s\n",strC); 
    return 0; 

Может кто-нибудь дать представление о том, как добавить разделитель с помощью функции strcat?

+3

На каком языке вы _actually_ используете? Вы отметили как C, так и C++. – paddy

+0

Используйте 'std :: string :: substring()' и конкатенацию или 'std :: ostringstream'. Покажите свои усилия, пожалуйста. Мы не твой торговый центр «Gimme teh codez plz» _. –

+1

Альтернативно, если у вас есть POSIX, вы можете использовать strptime() для синтаксического анализа AND CHECK FOR ERRORS, а затем strftime() для переформатирования. –

ответ

1

является одним из тех сценариев, где грубая сила подход просто ходить указатель вниз оригинальный DateString для вставки необходимых разделителей формата даты и времени, так же просто и эффективно, как и все остальное. Следующий код просто создает буфер из исходной строки, вставляя форматирование в буфер в соответствующие разделители и необходимые точки при копировании данных с data в buf. Индекс в buf просто выводится из позиции указателя p. В конце, после того, как все разделители были вставлены, и все символы скопированы в buf, buf - nul-terminated и нет в форме, чтобы перейти к вашим функциям даты.

#include <stdio.h> 

int main (void) { 

    char data[] = "20161909132409", 
     buf[32] = "", *p = buf; 
    size_t i = 0; 

    for (; data[i]; i++) { 
     if (i < 4) *p++ = data[i]; 
     else if (i == 4) { *p++ = '-'; *p++ = data[i]; } 
     else if (i < 6) *p++ = data[i]; 
     else if (i == 6) { *p++ = '-'; *p++ = data[i]; } 
     else if (i < 8) *p++ = data[i]; 
     else if (i == 8) { *p++ = ' '; *p++ = data[i]; } 
     else if (i < 10) *p++ = data[i]; 
     else if (i == 10) { *p++ = ':'; *p++ = data[i]; } 
     else if (i < 12) *p++ = data[i]; 
     else if (i == 12) { *p++ = ':'; *p++ = data[i]; } 
     else if (i < 14) *p++ = data[i]; 
    } 
    *p = 0; /* nul-terminate */ 

    printf (" original : '%s'\n formatted : '%s'\n", data, buf); 

    return 0; 
} 

Пример использования/вывода

$ ./bin/fmrdatestr 
original : '20161909132409' 
formatted : '2016-19-09 13:24:09' 

Посмотрите его и дайте мне знать, если у вас есть какие-либо вопросы.

3

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

Гораздо яснее просто сделать строку с позиционным форматом, используя заполнитель для символов, которые вы хотите вставить. Это будет делать трюк:

char *format_date(char date[20], const char *input) 
{ 
    const char format[20] = "XXXX-XX-XX XX:XX:XX"; 
    for(int i = 0; i < 20; i++) 
    { 
     if(*input && format[i] == 'X') 
      date[i] = *input++; 
     else 
      date[i] = format[i]; 
    } 
    return date; 
} 

И теперь вы можете повторно использовать его:

int main(void) 
{ 
    char date[20]; 

    /* simple example */ 
    format_date(date, "20161909132409"); 
    printf("%s\n", date); 

    /* in-place example */ 
    printf("%s\n", format_date(date, "20161909132409")); 
    printf("%s\n", format_date(date, "20161012131415")); 

    return 0; 
} 
+0

приятно! намного чище, чем мое предложение – yano

Смежные вопросы