使用sscanf从数字中读取数字

时间:2019-05-22 18:08:12

标签: c scanf

我正在尝试使用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";

3 个答案:

答案 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-n1x的数字文本的字符宽度。

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; 
}
相关问题