2017-01-27 56 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.和不正確的一天?

在此先感謝!

Jorg

回答

4

這是因爲你使用「我」而不是「d」。當使用「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

太感謝你了,這對我幫助很大! –