2017-01-27 5 views
1

これで、sscanf()関数の実際の動作が不思議です。 私は日付の指定した文字列を解析し、次のコードを持っている:sscanf()の不一致動作

#include <stdio.h> 

int main() 
{ 
    int year, month, day; 

    sscanf("20151106","%4i%2i%2i",&year,&month,&day); 
    printf("Year: %04i\tMonth: %02i\tDay: %02i\n",year,month,day); 

    sscanf("20151107","%4i%2i%2i",&year,&month,&day); 
    printf("Year: %04i\tMonth: %02i\tDay: %02i\n",year,month,day); 

    sscanf("20151108","%4i%2i%2i",&year,&month,&day); 
    printf("Year: %04i\tMonth: %02i\tDay: %02i\n",year,month,day); 

    sscanf("20151109","%4i%2i%2i",&year,&month,&day); 
    printf("Year: %04i\tMonth: %02i\tDay: %02i\n",year,month,day); 

    sscanf("20151110","%4i%2i%2i",&year,&month,&day); 
    printf("Year: %04i\tMonth: %02i\tDay: %02i\n",year,month,day); 

    sscanf("20151111","%4i%2i%2i",&year,&month,&day); 
    printf("Year: %04i\tMonth: %02i\tDay: %02i\n",year,month,day); 


    return 0; 
} 

を、出力は以下の通りです:

Year: 2015  Month: 11  Day: 06 
Year: 2015  Month: 11  Day: 07 
Year: 2015  Month: 11  Day: 00 
Year: 2015  Month: 11  Day: 00 
Year: 2015  Month: 11  Day: 10 
Year: 2015  Month: 11  Day: 11 

なぜのsscanf()が誤っ08.と09.日パースのでしょうか?

ありがとうございます!

あなたは "I" ではなく "d" を使用しているためだヨルグ

答えて

4

。 "i"フォーマットを使用する場合、0xで始まる数字はベース16として、0で始まる数字はベース8として読み取られます。

したがって、01〜07はベース8と10では同じです。正しい値ですが、08はゼロ、09は無効です。

は、たとえば、 "D" 指定子を使用するようにコードを変更し

#include <stdio.h> 

int main() 
{ 
    int year, month, day; 

    sscanf("20151108","%4d%2d%2d",&year,&month,&day); 
    printf("Year: %04d\tMonth: %02d\tDay: %02d\n",year,month,day); 

    return 0; 
} 

出力:

Year: 2015 Month: 11 Day: 08 
+0

を私をたくさん助けたこと、ありがとうございました! –