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



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

    • 没有找到相关文章

    最新更新