10

日付を変換して確認するために次のことを行っていますが、次の日付がtrueとして検証され続ける理由がわかりません。

%dだけチェックしません[01,31] + leading zerosか?これを行うためのより良い、より正確な方法はありますか?

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main () {
    struct tm tm; 

    char buffer [80];
    char *str = "29/Jan/2012";
    if (strptime (str, "%Y/%b/%d", &tm) == NULL)
        exit(EXIT_FAILURE);
    if (strftime (buffer,80,"%Y-%m-%d",&tm) == 0)
        exit(EXIT_FAILURE);

    printf("%s\n", buffer); // prints 29-01-20

    return 0;
}
4

1 に答える 1

8

29/Jan/20最初の部分文字列がパターンと一致するため(特にパターン20の最後の部分文字列と一致するため)、NULL以外を返します%d

strptime()非を返す場合NULL、パターンに一致する入力文字列の部分の後の次の文字へのポインタを返します。したがって、この場合、'1'日付文字列内の文字へのポインタが返されます。

入力文字列に何も残っていないことを確認する場合は、戻り値が入力文字列の最後にある終了nullを指していることを確認する必要があります。

int main ()
{
    struct tm tm;

    char buffer [80];
    char *str = "29/Jan/2012";
    char *end = strptime(str, "%Y/%b/%d ", &tm);
    if (end == NULL || *end != '\0')
        exit(EXIT_FAILURE);
    if (strftime (buffer,80,"%Y-%m-%d",&tm) == 0)
        exit(EXIT_FAILURE);

    printf("%s\n", buffer); // prints 29-01-20

    return 0;
}

パターンに末尾のスペースを追加したことに注意してください。strptime()これにより、入力の末尾の空白を受け入れることができます。それを許可したくない場合は、元のパターンを使用してください。

于 2012-05-30T03:28:35.953 に答える