Можете ли вы разделить входные данные scanf на два типа, которые делают две разные вещи? - PullRequest
0 голосов
/ 28 февраля 2019

В настоящее время я пишу простой код для умножения двух чисел, но я хотел бы добавить опцию, чтобы выйти из программы прямо при первоначальном приглашении «нажмите x, чтобы выйти».Это то, что я до сих пор имею:

  printf(" Please input two numbers between 0 and 4000 or press x to leave: \n\n");
  scanf(" %d %d", &var1, &var2);

  if ((var1 > 4000) || (var2 > 4000) || (var1 < 0) || (var2 < 0)) {
    while (1) {
      printf(
          "\n Input out of range, please use only values between 0 and 4000 \n\n");
      return main();
    }

    while (0) {
      return (0);
    }

  }

  printf("\n Your inputs are %d and %d. \n\n", var1, var2);
  printf(" %d multiplied by %d is equal to %d \n", var1, var2, var1*var2);

Я все еще чрезвычайно новичок в C, и я просто пытаюсь выяснить, есть ли способ уточнить в scanf(), если его ввод равен двумзатем идут десятичные значения, но если ввод единственного числа char равен x, то немедленно выходите.

Возможно ли это?

Если нет, то не могли бы вы дать намек о новом направлении, на которое я мог бы взглянуть?как другой оператор if(), чтобы проверить, что вошло в scanf()?

Я также предполагаю, что пользователь будет вводить ТОЛЬКО два числа или букву x.Я только написал в одном простом утверждении, чтобы уточнить до сих пор.Спасибо за любую информацию, которую вы можете предоставить.

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Невозможно использовать scanf таким способом.Самое близкое, что вы можете сделать, это как приведенный ниже код.Надеюсь, это поможет!

int var1, var2;
char ch;
while (1)
{
    printf("Please input two numbers between 0 and 4000\n\n");
    scanf(" %d %d", &var1, &var2);

    if ((var1 > 4000) || (var2 > 4000) || (var1 < 0) || (var2 < 0))
        printf("\n Input out of range, please use only values between 0 and 4000 \n\n");
    else
    {
        printf("\n Your inputs are %d and %d.\n", var1, var2);
        printf(" %d multiplied by %d is equal to %d \n", var1, var2, var1*var2);
        printf("Press x to leave or any other key to continue...\n\n");
        scanf(" %c", &ch);
        if (ch == 'x') break;
    }
}
0 голосов
/ 01 марта 2019

Это возможно, но с несколькими ограничениями.Код, предоставляемый @dbush, на самом деле является более элегантным вариантом, а код, предоставленный Gautam, проще, но делает это не так, как вам нужно.

Можно, хотя и проще, добиться того, что вам нужно, с помощью следующего кода:

Прежде чем углубляться в код, небольшое объяснение:

  • Принять2 числа, разделенные пробелом.
  • Поиск строки, если пользователь ввел x.Это можно сделать с помощью метода strcspn.Если да, выйдите, иначе продолжайте.
  • Теперь преобразуйте 2 числа, которые являются частью строки, в int s.Для этого используйте метод atoi.Используя его в исходной строке, вы можете получить 1-е число как int (то есть до тех пор, пока не встретите 1-е space).Извлекая вторую часть строки, т. Е. После пробела, конвертируйте ее в int, чтобы получить второе число.

    #include<stdio.h> 
    #include<string.h> 
    #include<stdlib.h>
    
    int main() {
        int var1, var2, index, length, isInvalid = 0;
        char s[10], s2[10];
    
    //do {
      isInvalid = 0;
      printf(" Please input two numbers between 0 and 4000 or press x to leave: \n\n");
      scanf("%[^\n]s", s); //accept the 2 numbers or the 'x' as a string
      length = strlen(s); //calculate the length of the string
    
      index = strcspn(s, "x"); //check if user has entered 'x'
    
      //if 'x' is present its position will be stored in 'index', if not present value of index will be length of string.
    
      if (index < length) { //if 'x' is present
        isInvalid = 0;
        printf("\nAborted");
        return 0;
      } else { //if 'x' isn't entered
        var1 = atoi(s); //converts the first part of string(before space) to its int equivalent
        index = strcspn(s, " "); //get the postion of space
        strncpy(s2, s + index, length); //get the part of string after space
        var2 = atoi(s2); //convert the second part of string into int
    
        //rest is your usual code.. without your return main() part which isn't really right
        if ((var1 > 4000) || (var2 > 4000) || (var1 < 0) || (var2 < 0)) {
          printf("\n Input out of range, please use only values between 0 and 4000 \n\n");
          isInvalid = 1;
        }
    
        printf("\n Your inputs are %d and %d. \n\n", var1, var2);
        printf(" %d multiplied by %d is equal to %d \n", var1, var2, var1 * var2);
      }
    //} while (isInvalid);
    
      return 0;
    }
    

Но учтите один очень важный недостатокздесь: вы ДОЛЖНЫ ввести 2 числа в качестве разделенных пробелами чисел при вводе данных.Это не работает с 2-мя нажатиями клавиши «Ввод».

0 голосов
/ 28 февраля 2019

Спецификатор формата %d для scanf ожидает чтения целочисленного значения.Если встречается что-то, не являющееся целым числом, оно прекращает чтение и оставляет в буфере несовпадающие символы.

Кроме того, main не следует вызывать рекурсивно.

Лучший способ обработкидля этого сначала нужно прочитать строку текста с fgets, а затем проверить, что это «х».Если это так, вырвитесь из цикла чтения.Если нет, используйте sscanf для чтения двух целых чисел и убедитесь, что возвращаемое значение равно 2, что означает, что были прочитаны 2 значения.

int valid;
do {
    char line[100];

    printf(" Please input two numbers between 0 and 4000 or press x to leave: \n\n");
    fgets(line, sizeof line, stdin);

    if (strcmp(line, "x\n") == 0) {
        break;
    }

    valid = 0;
    int cnt = sscanf(line, " %d %d", &var1, &var2);
    if (cnt != 2) {
         printf("Please enter two integers");
    } else if ( (var1 > 4000) || (var2 > 4000) || (var1 < 0) || (var2 < 0)) {
        printf( "\n Input out of range, please use only values between 0 and 4000 \n\n");
    } else {
        valid = 1;
    }
} while (!valid);

printf( "\n Your inputs are %d and %d. \n\n", var1, var2);
printf(" %d multiplied by %d is equal to %d \n", var1, var2, var1*var2);
...