Почему цикл будет попадать в бесконечный цикл при наборе символов - PullRequest
0 голосов
/ 18 марта 2019

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

#include <stdio.h>
int main()
{
  int x1, x2;
  do{
    printf("Input x1, x2:");
    scanf("%d,%d", &x1, &x2);
  }while (x1 * x2 > 0);
  printf("x1=%d,x2=%d\n", x1, x2);
  return 0;
}

1 Ответ

1 голос
/ 18 марта 2019

программа попадет в бесконечный цикл при наборе символов.

если вы не ввели правильный номер для scanf %d, неправильный ввод не удаляется, поэтому, если вы ничего не сделаете, вы получите его снова в следующий раз scanf %d

Предложение:

#include <stdio.h>

int main()
{
  int x1, x2;
  do{
    printf("Input x1, x2:");

    if (scanf("%d,%d", &x1, &x2) != 2) {
      char * lineptr = NULL;
      size_t n = 0;
      ssize_t r = getline(&lineptr, &n, stdin); /* flush input */

      if (r == -1)
        /* EOF */
        return -1;

      free(lineptr);
    }
  } while (x1 * x2 > 0);
  printf("x1=%d,x2=%d\n", x1, x2);
  return 0;
}

Компиляция и исполнение:

/tmp % gcc -pedantic -Wextra c.c
/tmp % ./a.out
Input x1, x2:1,2
Input x1, x2:a
Input x1, x2:1,a
Input x1, x2:1 2
Input x1, x2:0,1
x1=0,x2=1

(редактировать)

если вы просто хотите остановить цикл в случае ошибки:

#include <stdio.h>

int main()
{
  int x1, x2;
  int ok = 1;

  do{
    printf("Input x1, x2:");

    if (scanf("%d,%d", &x1, &x2) != 2) {
      ok = 0;
      break;
    }
  } while ((x1 * x2) > 0);

  if (ok)
    printf("x1=%d,x2=%d\n", x1, x2);

  return 0;
}

или завершение всего выполнения по ошибке

#include <stdio.h>

int main()
{
  int x1, x2;

  do{
    printf("Input x1, x2:");

    if (scanf("%d,%d", &x1, &x2) != 2)
      return 0;
  } while ((x1 * x2) > 0);

  printf("x1=%d,x2=%d\n", x1, x2);

  return 0;
}

Компиляция и исполнение:

/tmp % gcc -pedantic -Wextra c.c
/tmp % ./a.out
Input x1, x2:1,2
Input x1, x2:1,0
x1=1,x2=0
/tmp % ./a.out
Input x1, x2:1,,
/tmp % 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...