使用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
相关产品推荐
相关产品推荐

