2016-12-08 1 views
-1

Я пытаюсь получить пользовательский ввод в функцию, используя scanf или fgets.Получение определенного пользовательского ввода и подсчета аргументов в функции с помощью scanf или fgets?

Я пишу C.

пользователь должен ввести 2 (положительные) целые числа. Разница между этими двумя должна быть равна 1. Я должен проверить, действительно ли было дано только 2 параметра.

Функция должна возвращать меньшую одну из заданных целых чисел, если:

  • дано количество аргументов == 2

  • разница фактически 1

функция должна возвращать -1, если:

    ! Рассчитывать
  • аргумент = 2
  • разница> 1

Функция должна вернуть -2, если:

  • оба приведенные аргументы имеют такое же значение

у меня нет проблема сравнения целых чисел и возврата правильного значения, моя проблема связана с входом. До сих пор I've попытался это подходы:

1.)

int getInput(){ 
    int user_input_nod_1; 
    int user_input_nod_2; 
    scanf("%d %d",&user_input_nod_1,&user_input_nod_2) 
    (...) 
} 

Проблема здесь в том, что у меня нет никакого способа знать, если пользователь ввел более 2-х целых чисел.

2.)

int getInput(){ 
    int user_input_nod_1; 
    int user_input_nod_2; 
    char user_input_over; 
    scanf("%d %d",&user_input_nod_1,&user_input_nod_2) 
    scanf("%c",&user_input_over) 
    if(user_input_over != '\0'){ 
    return -1; 
    } 
    (...) 
} 

Здесь возвращается программ -1, если больше двух параметров приведены, и отлично работает, когда заданы два параметра, но если дано только один scanf ждет, пока бесконечности на второй вход (даже после нажатия ввода). Пользователь не знаю, как закончить поток (CMD + d, ...)

3.)

int getInput(){  
    char input_nods[10]; 

    if(fgets(input_nods, 10, stdin) != NULL) 
    { 
    puts(input_nods); 
    } 

    char input_c1; 
    char input_c2; 
    char input_nod_over; 

    sscanf(input_nods,"%c %c %c",&input_c1, &input_c2, &input_nod_over); 

    char *nod_check_1, *nod_check_2; 
    int input_nod_1 = strtol(&input_c1, &nod_check_1, 10); 
    int input_nod_2 = strtol(&input_c2, &nod_check_2, 10); 

    if (input_nod_over != '\0' || input_nods[2] == ' ' || input_nods[2] == '\0') 
    { 
     return -1; 
    } 
} 

Это отлично работает, когда даны целые числа в диапазоне 0-9. Как только вход имеет две цифры, sscanf перепутался с пробелом, который fgets сохранен в input_nodes [].

Есть ли способ, которым я мог бы достичь того, что искал? Спасибо.

+1

Прочитайте документацию 'scanf'. – Olaf

+0

Я собирался написать что-то саркастическое, но потом я нашел то, что искал, глубоко погруженный в какой-нибудь веб-сайт на scanf. Спасибо ^^ –

+0

Комментарии пользователей более высокого уровня - это самое время, о котором стоит подумать. Независимо от того, являются ли они краткими или нет :-) – Olaf

ответ

1

я достиг теперь с помощью этого цикла:

int user_input_nod_1; 
int user_input_nod_2; 

char buf[BUFSIZ], junk[BUFSIZ]; 

fprintf(stderr, "> ");    
while (fgets(buf, sizeof(buf), stdin) != NULL) 
{ 
    if (sscanf(buf, "%i%i%[^\n]", &user_input_nod_1, &user_input_nod_2, junk) == 2) 
     break; 
    fprintf(stderr, "[ERR] \n"); 
    fprintf(stderr, "> "); 
} 

(с помощью ">" в какой-то курсор ...)

0

В-третьих, вы можете использовать input_nod_1 и input_nod_2 и не использовать функцию sscanf.

В первом использовании strtol, вы должны проверить, что nod_check_1 пустым (или пробел, если вы хотите быть более точным), а во втором использовании вы должны проверить, что nod_check_2 является NULL.

Однако, я хотел бы использовать в качестве longstrtol результата (для того, чтобы избежать долго-> Int литья переполнения) и проверьте errno в том случае, strtol возвращает 0.

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