为什么sscanf没有读取格式字符串中的第一个参数?

时间:2015-06-07 08:12:44

标签: c string string-formatting scanf

在以下程序中,格式字符串中除第一个值(月份)之外的所有内容都将被读入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

1 个答案:

答案 0 :(得分:4)

您使用的是错误的格式说明符。 %d用于intst.*int吗?否。

根据the documentationSYSTEMTIME结构定义为

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;

因此,WORDst.*)是unsigned shortunsigned short的正确格式说明符为%hu。根据标准(n1570)使用错误的格式说明符导致Undefined Behavior

  

7.21.6.2 fscanf功能

     

[...]

     
      
  1. 如果转换规范无效,则行为未定义。 287)
  2.