在以下程序中,格式字符串中除第一个值(月份)之外的所有内容都将被读入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 %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
答案 0 :(得分:4)
您使用的是错误的格式说明符。 %d
用于int
。 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,
字符强>
16位无符号整数。范围是0到65535十进制。
此类型在
WinDef.h
中声明如下:typedef unsigned short WORD;
因此,WORD
(st.*
)是unsigned short
。 unsigned short
的正确格式说明符为%hu
。根据标准(n1570)使用错误的格式说明符导致Undefined Behavior:
7.21.6.2 fscanf功能
[...]
- 如果转换规范无效,则行为未定义。 287)
醇>