Работа с неожиданным вводом - PullRequest
1 голос
/ 18 ноября 2011

Просто небольшой запрос, используя scanf, который в моем случае будет сканировать число X целых чисел в переменные, каждое из которых разделено пробелом.Любые подсказки / подсказки относительно того, как поступить с вводом, если при вводе целых чисел между ними нет пробелов, например, мой ввод такой, как XXXX, но если был введен XX XX, как я мог бы справиться с этим в моем scanf?функция?

Имея в виду мой сканф (% d% d% d% d "....)

Приветствия.

Ответы [ 4 ]

1 голос
/ 18 ноября 2011

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

int vars[4];
if (scanf("%d %d %d %d", vars[0], vars[1], vars[2], vars[3]) != 4) {
    // error
}

Затем проверьте, находится ли каждая переменная в диапазоне:

for (int i = 0; i < 4; i++) {
    if (vars[i] < 0 || vars[i] > 9) {
        // error
    }
}
1 голос
/ 18 ноября 2011

Я бы просто избежал scanf().Если каждое целое число представляет собой просто одну цифру, вероятно, будет работать что-то вроде следующего:

int vars[4];
for (int i = 0; i < 4;) {
  int c = getchar();
  if (isdigit(c)) {
    vars[i++] = c - '0';
  } else if (!isspace(c)) {
    // error
    break;
  }
}

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

1 голос
/ 18 ноября 2011

Я бы считал одно значение за раз со счетчиком и проверил, больше ли число, чем 9, 99 или 999, чтобы проверить наличие нескольких цифр.Если вы это сделаете, извлеките каждую цифру с делением и увеличьте счетчик для каждой цифры.

0 голосов
/ 18 ноября 2011

Пока scanf читает после нажатия кнопки ввода, может быть проще прочитать строку как строку, а затем попытаться проанализировать ее. Вы можете исправить ввод с помощью backspace и т. Д. На полнофункциональном терминале, так что это немного удобнее для пользователя, чем getchar. Мы ищем только однозначные цифры, верно?

Может быть, что-то вроде:

char buffer[SOMECOUNT];
int digits[4];
int read, i;
scanf("%s", buffer);
for(int i = 0; i < strnlen(buffer, SOMECOUNT); ++i)
{
    if( read >= 4 )
         break;
    if( isdigit(buffer[i]) )
    {
         digits[read] = buffer[i] - '0';
         read++;
    }
 }
if ( read < 4 )
    printf(error...);

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

...