2015-06-07 54 views
1

在以下程序中,除了格式化字符串中的第一個值(月份)之外的所有內容都正被讀入SYSTEMTIME結構中。任何人都可以幫我解決這個問題嗎?爲什麼sscanf不能讀取格式字符串中的第一個參數?

#include <Windows.h> 
#include <stdio.h> 

int main() 
{ 
    SYSTEMTIME st; 
    char buf[50]; 
    strcpy(buf, "6/23/2015 12:00:00"); 
    sscanf(buf, "%d/%d/%d %d:%d:%d", &st.wMonth, &st.wDay, &st.wYear, &st.wHour, &st.wMinute, &st.wSecond); 
    printf("%d %d %d %d %d %d\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); 
    return 0; 
} 

程序的輸出是:

2015 0 23 12 0 0 

它應該是:

2015 6 23 12 0 0 
+3

嘗試'%hu',而不是'%D'。 –

+3

MinGW給出了幾個警告:'警告:format'%d'需要'int *'類型的參數,但是參數3的類型'WORD *'[-Wformat =]' –

+0

@Cool Guy,工作;如果發佈一個關於* why *的細節的答案我會接受它給你信用。 :) –

回答

4

您使用了錯誤的格式說明。 %d用於int s。是st.*int?第

按照the documentation,該SYSTEMTIME結構被定義爲

typedef struct _SYSTEMTIME { 
    WORD wYear; 
    WORD wMonth; 
    WORD wDayOfWeek; 
    WORD wDay; 
    WORD wHour; 
    WORD wMinute; 
    WORD wSecond; 
    WORD wMilliseconds; 
} SYSTEMTIME, *PSYSTEMTIME; 

現在,什麼是WORD

here引用,

WORD

一個16位無符號整數。範圍是0到65535十進制。

此類型在WinDef.h聲明如下:

typedef unsigned short WORD;

所以,WORDst.*)是unsigned shortunsigned short的正確格式說明符是%hu。使用錯誤的格式說明導致Undefined Behavior按照標準(n1570):

7.21.6.2 fscanf函數

[...]

  • 如果轉換規範無效,則行爲未定義。 287)
  • 相關問題