2016-09-21 2 views
0

Это для домашней работы, поэтому я придерживаюсь требований, которые я описываю.Как использовать scanf для правильного анализа и фильтрации динамического ввода?

мне нужно обрабатывать ввод следующей общей форме:

XYZ A1 5 

Первая часть (XYZ) является командой, A1 является адресом (мне нужно только 1), и 5 является значение команда. Кроме того, мне нужно обрабатывать команды, которые не имеют ни адреса, ни значения (например, XYZ) и команд, которые имеют только адрес, но не имеют значения (XYZ A1).

мне удалось уткой-ленты это вместе, который, кажется обрабатывать все кашель довольно хорошо:

n = scanf("%c%c%c A%i %i",&c1,&c2,&c3,&a,&val); 

Так что я могу использовать n (сколько аргументов/переменных scanf удалось соответствовать), чтобы выяснить, что вроде команды, а затем выполните некоторые основные проверки, чтобы получить то, что мне нужно. И это работает очень хорошо!

Но вот моя проблема: Существует также команда в формате XYZ A1 A2 - как в нем имеет два значения «адрес». Как мне получить scanf, чтобы разобрать это? Еще раз, мне не нужен «A» для анализа.

Если я:

scanf("%c%c%c A%i A%i",&c1,&c2,&c3,&a,&val); 

затем различные другие команды не будут работать, когда адрес и стоимость входа не имеют «А» перед ними.

P.S. Не разрешается использовать любую форму строк/массивов, следовательно, символы;

Что я могу здесь сделать?

+3

Советую прочитать ввод с помощью 'fgets', а затем применить' sscanf'. Затем, когда присутствуют только, скажем, 2 из 3 полей, которые вы запрашиваете, легко игнорировать остальную часть строки и перейти к следующему. И сканируйте три строки *, прежде чем анализировать столько, сколько было введено.Используйте возвращаемое значение функции из 'sscanf'. –

+1

Вы также можете использовать '% s' для последнего и проанализировать эту строку после (если она существует). Но это использование строки/массива, и это решение выше. В качестве альтернативы вы можете использовать '% c% i' для последнего и проверить, что такое первый символ. –

+0

Guyssss, пожалуйста, прочитайте сообщение полностью - не допускается любая форма массива, включая строку. Хотя я проверю первое решение Weather Vane, это может быть правильно, потому что он по-прежнему использует какой-то сканер, спасибо! – Coma

ответ

2

Не пытайтесь делать все это в одном звонке scanf. Вместо этого, прочитайте команду первой, проверьте, если он принимает дополнительные параметры, а затем прочитать эти:

n = scanf("%c%c%c", &c1, &c2, &c3); 
if (n != 3) 
    // input error, bail out here 

if (has_address(c1, c2, c3)) 
{ 
    if (scanf("A%i", &a1) != 1) 
    // input error, bail out here 
} 

if (has_2nd_address(c1, c2, c3)) 
{ 
    if (scanf("A%i", &a2) != 1) 
    // input error, bail out here 
} 

if (has_value(c1, c2, c3)) 
{ 
    if (scanf("%i", &val) != 1) 
    // input error 
} 

has_address, has_2nd_address и has_value просто заполнители для любой логики, которые нужно использовать, чтобы определить, нужно ли читать один или два адреса, и нужно ли читать значение.

+0

Не могу поверить, что это не перешло мне в голову, спасибо! – Coma

0

Решение заключается в использовании scanf("%c%c%c A%i %c%i",&c1,&c2,&c3,&a, &c4, &val);, проверьте, является ли c4 цифрой, и в этом случае у вас есть немного больше работы, чтобы сделать правильный val, но не так много.

0

Проверьте возвращаемое значение. Если оно равно 4, последнее число еще нужно отсканировать.

// Add leading space to consume previous line's \n 
int n = scanf(" %c%c%c A%i A%i", &c1, &c2, &c3, &a, &val); 

switch (n) { 
    case 5: Handle_XYZ_A1_A2(c1, c2, c3, a, val); break; 
    case 4: // A not detected 
    int n = scanf("%i", &val); 
    if (n == 1) { Handle_XYZ_A1_2(c1, c2, c3, a, val); break; } 
    default: 
    Handle_Bad_Input(); 
} 

Использование fgets() первый имеет больше смысла, но, кажется, не допускается заданным ограничениям OP.

Смежные вопросы