программа попадет в бесконечный цикл при наборе символов.
если вы не ввели правильный номер для 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 %