Проверьте форматирование без конверсий - PullRequest
0 голосов
/ 01 ноября 2018

Есть ли способ, как проверить, были ли введены какие-то конкретные символы при вводе, используя scanf без использования преобразования символов?

int main(void)
{
if(scanf("{ ["))
    printf("GOOD INPUT\n");
else
    printf("BAD INPUT\n");
return 0;
}     

Этот код всегда дает неверный параметр ввода (он ожидает, что возвращаемое значение scanf будет равно 1), но интересно, что если я введу не те символы, которые нужны, он сразу же выдаст неверный ввод, но если я введу его, как указано в scanf, он сдувается плохой ввод у меня ПОСЛЕ того, как я ввел весь ввод.

Значит, он должен ожидать ввода в указанном формате, но у меня вопрос: как я могу проверить его без каких-либо преобразований и выполнить соответствующее действие в зависимости от того, правильно ли был введен ввод?

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

scanf (и двоюродные братья) возвращает количество успешных конверсий. Если вы укажете 0 конверсий, то возвращаемое значение всегда будет равно 0.

Чтобы использовать scanf для этой задачи, я бы, вероятно, воспользовался парой преобразований в наборы:

char a[2], b[2];
if (scanf("%1[{] %1[[]", &a, &b) == 2)
    printf("Matched");

Или, вы можете немного упростить это:

char a[2];
if (scanf("{ %1[[]", &a) == 1)

В любом случае, мы указали, что каждый набор сканирования соответствует только одному указанному символу, но это все еще преобразование, поэтому мы можем видеть, был ли он успешным или неудачным.

К сожалению, нам все еще нужно присвоить результат где-нибудь. scanf поддерживает использование *, например, так: "% * s", чтобы сказать ей читать строку, но нигде не сохранять результат - но когда вы это сделаете, это преобразование не засчитывается в возвращаемом значение, так что (так же, как и раньше) мы не можем использовать его, чтобы определить, получили ли мы соответствие или нет.

0 голосов
/ 01 ноября 2018

Если хорошо для ввода нужно ровно 3 символа: { пробел [, используйте "%*1[ ]" для сканирования пробела и "%n", который сохраняет количество символов сканирования, чтобы обеспечить достижение ожидаемого конца сканирования.

int main(void) {
  int n = -1;
  scanf("{%*1[ ][%n", *n);
  if (n >= 0) {
    printf("GOOD INPUT\n");
  } else {
    printf("BAD INPUT\n");
  }
  return 0;
} 

Я бы рекомендовал сначала прочитать строку ввода с fgets(), а затем проанализировать буфер. Это может оставить stdin в более известном состоянии, когда произойдет ввод bad .

0 голосов
/ 01 ноября 2018

Вы можете использовать %n преобразование scanf (оно устанавливает ниже в pos количество прочитанных символов)

int pos= -1;
if (scanf("{ [%n", &pos) >=0 && pos>0) 
   printf("GOOD INPUT\n");
else 
   printf("BAD INPUT");

Осторожно, счетчик возврата scanf может зависеть от реализации (вероятно, он остается равным 0). Но pos получил положительное смещение scanf действительно получил {, за которым следуют некоторые (ноль или более) пробелов, за которыми следует [.

Однако вам, вероятно, понадобится какой-нибудь лексический анализ и синтаксический анализ , тогда scanf не является хорошим решением. Вам лучше прочитать всю строку (например, с помощью fgets или getline ) и разобрать ее позже.

См. Также страницу man scanf (3)

...