Вы действительно не должны использовать scanf
напрямую ... особенно если вы ожидаете нескольких возможных форматов.
Попробуйте вместо этого использовать fread
и затем преобразовать ввод в правильный формат.
т.е.:
int main() {
while (1) {
char buf[1024];
printf("\nnumber to convert:\n ");
unsigned long len = fread(buf, 1, 1023, stdin);
buf[len] = 0;
if (len == 0 || (len == 1 && buf[0] == '\n') ||
(len == 2 && buf[0] == '\r' && buf[1] == '\n'))
break;
int val = atoi(buf);
ibits(val);
}
return 0;
}
Это также позволит вам проверять ввод и проверять атаки переполнения:
int main() {
while (1) {
char buf[1024];
printf("\nnumber to convert:\n ");
unsigned long len = fread(buf, 1, 1023, stdin);
buf[len] = 0;
if (len > 11)
goto under_attack;
if (len == 0 || (len == 1 && buf[0] == '\n') ||
(len == 2 && buf[0] == '\r' && buf[1] == '\n'))
break;
if (buf[0] != '-' && (buf[0] < '0' || buf[0] > '9'))
goto under_attack;
int val = atoi(buf);
ibits(val);
}
return 0;
under_attack:
fprintf(stderr, "Under attack?!\n");
return -1;
}