Поймать пользователя, вводящего строку при ожидании целого числа? - PullRequest
1 голос
/ 17 января 2020

Я делаю программу, в которой пользователь вводит два двоичных числа и символ операции, а затем я печатаю вывод в десятичном виде. Я хочу, чтобы l oop продолжал работать, пока пользователь не введет quit. Как я могу прочитать, если пользователь вводит quit, а не целочисленное значение в scanf? Есть ли способ поймать это?

#include <stdio.h>
#include <string.h>
int toDecimal(int num);

int main(){
    // Define variables
    int num1, num2, result = 0;
    char op;
    char run[4] = "go";

    // While loop to rerun program until quit is entered
    while(strcmp(run, "quit\n") != 0){
        // Reads user input
        scanf("%i %c %i", run, &num1, &op, &num2);



        printf("\nnum1: %i num2: %i op: %c\n", num1, num2, op);

        num1 = toDecimal(num1);
        num2 = toDecimal(num2);
        printf("\nnum1: %i num2: %i op: %c\n", num1, num2, op);

    }
    printf("\nGoodbye!\n");
    return 0;
}

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

Ответы [ 2 ]

3 голосов
/ 17 января 2020

Как я могу прочитать, если пользователь вводит quit, а не целочисленное значение в scanf?

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

// Read user input
char buf[80]; // Use adequate size input buffer,
while (fgets(buf, sizeof buf, stdin)) {
  buf[strcspn(buf, "\n")] = '\0'; // Lop off potential trailing \n

  if (sscanf(bufm "%i %c %i", &num1, &op, &num2) == 3) {
    printf("\nnum1: %i num2: %i op: %c\n", num1, num2, op);
    num1 = toDecimal(num1);
    num2 = toDecimal(num2);
    printf("\nnum1: %i num2: %i op: %c\n", num1, num2, op);
  } else if (strcmp(buf, "quit")== 0) {
    break;
  } else {
    printf("Bad input <%s> ignored\n", buf);
  }
}
1 голос
/ 17 января 2020

Это довольно базовая c идея, я надеюсь, вы поняли. Вы также можете использовать динамическое c выделение памяти при чтении строки.

В основном вы читаете весь ввод с помощью fgets и вы извлекаете переменные, используя sscanf .

#include <stdio.h>
#include <string.h>

int main ()
{
int n1,n2;
char arr[1000],oper;

fgets(arr,sizeof(arr),stdin);
 while (strcmp(arr,"quit\n")!=0){
    if (sscanf(arr,"%d %c %d",&n1,&oper,&n2)==3); /* Scanning for each number and operator and checking input*/
    else
    printf("wrong input");
/*  Code */
    fgets(arr,sizeof(arr),stdin);
    }
return 0;
}
...