在下面的程序中,格式字符串中除了第一个值(月份)之外的所有值都被读入SYSTEMTIME结构。有人能帮我解决这个问题吗?
#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 %dn", 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
您使用了错误的格式说明符。%d
用于int
s。是st.*
还是int
?没有。
根据文档,SYSTEMTIME
结构被定义为
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
WORD
是什么?
从这里引用,
<词/strong>
16位无符号整数。取值范围为0 ~ 65535的十进制。
该类型在
WinDef.h
中声明如下:
因此,WORD
(st.*
)是unsigned short
。正确的unsigned short
格式说明符是%hu
。按照标准(n1570),使用错误的格式说明符会导致未定义行为:
7.21.6.2 fscanf函数[…]
- 如果转换规范无效,则行为未定义。<一口> 287)一口>