我正在尝试使用sscanf
读取/提取两位数字。
面临一些问题。
char* str = "2019/05/28";
int x,y,z;
sscanf(str, "%d/%d/%d", &x, &y, &z);
It reurns me o/p as 2019, 05, 28 which is ok.
但是from 2019
我只想提取19
。
我尝试%2d
返回20
。而且我还需要检查月份数是否也是两位数,我尝试了所有可能的方式,但还没有碰到运气。
请帮助。
更新:
I also tried %2d%d -> which gives me 19
。
但是不确定我是否会getting 4 digits or 2 digits always
。
输入可能是char* str = "19/05/28";
答案 0 :(得分:2)
鉴于您希望它在sscanf
中完成,可以通过以下方式完成:
if (sscanf(str, "%*2d%2d/%2d/%2d", &y, &m, &d) != 3)
goto err;
编辑:
添加一些支票作为示例:
if (sscanf(str, "%*2d%2d/%2d/%2d", &y, &m, &d) != 3)
goto err;
if (sscanf(str, "%4d", &tmp) != 1)
goto err;
if (tmp < 1900)
goto err_year;
sscanf
具有最大宽度字段,而不是确切的宽度字段,因此您必须手动检查用户是否输入3位数的年份,并考虑如果这样做的话
在这种情况下,我将不使用它,因为您仍然需要读取四位数以进行支票,因此,在这种情况下, @chux 的解决方案是最好的:
if (sscanf(str, "%4d/%2d/%2d", &year, &m, &d) != 3)
goto err;
if (year < 1900)
goto err_year;
y = year % 100;
答案 1 :(得分:1)
使用x℅= 100来获取年份的最后两位数字。
使用y <100之类的校验来确保y小于或等于3个数字。更准确地说,可以写(y <= 12)。这里要注意的一件事是,整数会忽略前导零。因此输入“ 05”将转换为5。
char* str = "2019/05/28"; int x,y,z;
sscanf(str, "%d/%d/%d", &x, &y, &z);
x%=100;
if(y<=12) {
//valid
}
答案 2 :(得分:0)
使用"%n"
读取以记录扫描的偏移量。
" %n%d%n", &n1, &i, &n2
导致n2-n1
是x
的数字文本的字符宽度。
int x1, x2;
int y1, y2;
int n = 0;
sscanf(str, " %n%d%n/ %n%d%n/%d %n", &x1, &x, &x2, &y1, &y, &y2, &z, &n);
// Was the string fully parsed with no trailing text?
if (n > 0 && str[n] == 0) {
switch (x2-x1) {
case 2: /* 2 character date */ break;
case 4: /* 4 character date */ x %= 100; break;
default: return error;
}
if (y2 - y1 != 2) { // I need to check the months are also in two digits
return error;
}
} else {
return error;
}