2016-11-28 4 views
2

Я создаю программу, которая должна читать ввод от пользователя в виде команды, такой как «команда 12», где команда является конкретным словом и должна храниться в отдельной переменной, после нее также должен быть в своей переменной.Проверьте, соответствует ли входное слово в C

Я создал переменную, в которой есть слово, которое должно соответствовать переменной команды и int для хранения.

char rule[5] = {'r', 'u', 'l', 'e', '\0'}; 
char command[6]; 
int cmd_num; 

И затем используется scanf, чтобы прочитать его, а затем сравнить его с strcmp.

scanf("%s %d", &command, &cmd_num); 
if ((strcmp(command, rule)) != 0) 
{ 
    printf("Error.\n"); 
    return 1; 
} 

Однако он не работает, как я ожидал бы. Я гугл в течение нескольких часов, но я не могу найти, как правильно хранить эту строку и номер после нее. Может ли кто-нибудь помочь мне понять, как хранится строка? Это поможет мне понять, почему strcmp не работает так, как я ожидал.

Или есть ли лучший способ проверить, соответствует ли пользовательский ввод определенному слову? Число после того, как это кажется проблемой для меня. Я пытался играть с функциями, но я не смог прийти к результатам. Заранее спасибо.

ответ

2

Во-первых, вы можете непосредственно определить rule как строковые, используя двойные кавычки (и, чтобы избежать писать в него, сделать его постоянным указателем):

const char *rule = "rule"; 
char command[6]; 
int cmd_num; 

При использовании scanf, ограничение длины для чтения, чтобы избежать переполнение буфера (с помощью %5s, который максимальный размер массива минус ноль-терминатор), и не передают адрес для массивов/указателей, поскольку scanf уже может получить доступ к адресу строки для записи в:

nb_items = scanf("%5s %d", command, &cmd_num); 

Обратите внимание, что вы можете узнать, сколько предметов было отсканировано (объявить int nb_items;). Например, если пользователь забывает вводить число или вводит не номер, вы получите nb_items==1, и вы узнаете, что cmd_num не был инициализирован.

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

+0

Я попытался использовать предел для scanf (% 5s), проблема в том, что у меня есть две команды, я не знаю, какой из них будет вводить пользователь, и мне нужно их распознать и, к сожалению, они не совпадают длина – Pernick

+0

, тогда ваш буфер 'command' слишком мал. Увеличьте его до самой большой длины команды. Не проверка вашего буфера может привести к сбою вашей программы. 5 - максимальный предел. Вам не нужно вводить 5 символов. –

+0

Я пытался, но тогда strcmp не работает, не так ли, потому что строки arent равны? Допустим, что мой вход - «ворон 12», и у меня есть const char * raven = «raven»; Когда я использую strcmp для этих двух, это не работает, но когда я их печатаю, они печатают одну и ту же строку. – Pernick

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