2016-09-19 19 views
2

私はこのデータで20161909132409の14桁の文字列を持っています。この形式に変換する場合は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

あなたは実際にどの言語を使用していますか? CとC++の両方にタグを付けました。 – paddy

+0

'std :: string :: substring()'と連結または 'std :: ostringstream'を使用してください。あなたの努力のいくつかをすべて表示してください。私たちはあなたの_ "Gimme teh codez plz" _ここのショッピングモールではありません。 –

+1

POSIXをお持ちの場合は、strptime()を使用してAND CHECK FOR ERRORSを解析し、strftime()を使用して再フォーマットすることができます。 –

答えて

1

ザ・はこれらのシナリオのいずれかです。単純に、元の日付ストリングダウンポインタを歩くの強引なアプローチ必要な日付と時刻の形式の区切り記号を挿入するのは、他のものと同じくらい簡単で効率的です。次のコードは、元の文字列からバッファを作成し、適切な区切り文字とバッファに書式を挿入します。dataからbufにコピーされます。bufのインデックスは単にポインタpの位置から派生​​したものです。最後にすべての区切り記号が挿入され、bufbufにコピーされたすべての文字は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

関連する問題