解析的version字符串是:V2.0.1B(build 230525) 230525 下面函数能没能解析到解析到year, month, day,结果是这样:version:V2.0.1B(build 230525) major:2, minor:0, patch:1, custom:0, year:0, month:0, day:182 函数是: void getSoftVersion(char *major, char *minor, char *patch, char *custom, char *year, char *month, char *day) { char version[48]; *custom = 0; mkSoftVersion(version); printf("version:%s\n", version); char* token = strchr(version, 'B'); if (token == NULL) { sscanf(version, "V%d.%d.%d.%dC(build %02d%02d%02d)", major, minor, patch, custom, year, month, day); } else { sscanf(version, "V%d.%d.%d%dB(build %02d%02d%02d)", major, minor, patch, custom, year, month, day); } printf("major:%d, minor:%d, patch:%d, custom:%d, year:%d, month:%d, day:%d\n", *major, *minor, *patch, *custom, *year, *month, *day); return; }
时间: 2024-02-02 14:05:26 浏览: 105
字符串报文解析函数
根据代码,可以看出解析函数getSoftVersion中,先调用mkSoftVersion函数获取软件版本号,并将版本号存储在version字符串中。然后在version字符串中查找字符'B',如果找到了,则使用第二个sscanf()函数解析版本号;否则,使用第一个sscanf()函数解析版本号。
对于版本号V2.0.1B(build 230525),因为找到了字符'B',所以使用第二个sscanf()函数解析版本号。具体的解析格式为:"V%d.%d.%d%dB(build %02d%02d%02d)",解析出来的结果如下:
- major:2
- minor:0
- patch:1
- custom:0
- year:23
- month:5
- day:25
其中,year表示的是23,而不是2023;month表示的是5,而不是5月;day表示的是25,而不是25号。因此,结果中的年份、月份、日期都是错误的。
为了解决这个问题,可以将解析年份、月份、日期的格式改为"%04d%02d%02d",然后在解析成功后,将解析出来的年份加上2000,得到正确的年份。修改后的代码如下:
```
void getSoftVersion(char *major, char *minor, char *patch, char *custom, char *year, char *month, char *day) {
char version[48];
*custom = 0;
mkSoftVersion(version);
printf("version:%s\n", version);
char* token = strchr(version, 'B');
if (token == NULL)
{
sscanf(version, "V%d.%d.%d.%dC(build %02d%02d%02d)", major, minor, patch, custom, year, month, day);
}
else
{
sscanf(version, "V%d.%d.%d%dB(build %04d%02d%02d)", major, minor, patch, custom, year, month, day);
*year += 2000;
}
printf("major:%d, minor:%d, patch:%d, custom:%d, year:%d, month:%d, day:%d\n", *major, *minor, *patch, *custom, *year, *month, *day);
return;
}
```
修改后的代码中,使用"%04d%02d%02d"格式解析年份、月份、日期,并在解析成功后将年份加上2000。这样就可以得到正确的年份、月份、日期了。
阅读全文