Чтение цифр из числа с помощью sscanf - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь прочитать / извлечь номер из двух цифр, используя 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 ]

2 голосов
/ 22 мая 2019

Если вы хотите, чтобы это было сделано в 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 имеет поле максимальной ширины, а не поле точной ширины, поэтому вам нужно проверить вручную, вводит ли пользователь трехзначный год, и подумать, что делать, если так

Я бы не сталне используйте его в этом случае, потому что вам все еще нужно прочитать четыре цифры для проверки, поэтому решение @ chux является лучшим в этом случае:

if (sscanf(str, "%4d/%2d/%2d", &year, &m, &d) != 3)
        goto err;
if (year < 1900)
        goto err_year;
y = year % 100;
1 голос
/ 22 мая 2019

Используйте x℅ = 100, чтобы получить две последние цифры года.

Используйте проверку, например, y <100, чтобы убедиться, что y меньше или равно 3 цифрам. Точнее yoy может написать (y <= 12). Здесь следует отметить, что целое число игнорирует ведущие нули. Таким образом, ввод «05» будет преобразован в 5. </p>

char* str = "2019/05/28"; int x,y,z; 
sscanf(str, "%d/%d/%d", &x, &y, &z);

x%=100;
if(y<=12) {
    //valid
}
0 голосов
/ 23 мая 2019

Считайте, используя "%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; 
}
...