2015-06-07 53 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)
  • 相关问题