You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sscanf解析日期字符串时忽略连字符的问题求助

解决sscanf解析日期字符串时把'-'识别为负号的问题

嘿,这个坑我之前踩过!问题出在你给sscanf用的格式串上——当你写%d %d %d的时候,sscanf会把-当成整数的负号前缀来处理,而不是日期的分隔符,所以才会出现1990--1--1的诡异输出。

正确的解法:把分隔符写进格式串

直接在%d之间加上固定的分隔符-,这样sscanf就会把-当成必须匹配的字面量,跳过它去读取后面的数字:

#include <stdio.h>

int main() {
    char date[] = "1990-01-01";
    int year, month, day;
    // 格式串里直接写'-'作为分隔符
    sscanf(date, "%d-%d-%d", &year, &month, &day);
    // 如果要保留前导零的格式,可以用%02d
    printf("%d-%02d-%02d\n", year, month, day); // 输出:1990-01-01
    return 0;
}

为什么你试的%*-不行?

%*是sscanf的跳过匹配内容的语法,比如%*d会跳过一个整数但不把它存到变量里。你写%*-的话,它会先尝试匹配一个整数然后跳过,再找-,这完全不符合你的需求,反而会把本该读取的数字跳过,所以才会出错。

额外小技巧:兼容带空格的格式

如果你的日期字符串可能有空格(比如"1990 - 01 - 01"),可以在格式串里加入空格,或者用%*c跳过任意单个分隔符:

// 兼容带空格的分隔符
sscanf(date, "%d - %d - %d", &year, &month, &day);
// 或者用%*c跳过任意单个字符(比如'-'或空格)
sscanf(date, "%d%*c%d%*c%d", &year, &month, &day);

内容的提问来源于stack exchange,提问作者JeanBook

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:22:55