int getnumber char text 50 Input number int valid num char buf 500 whi

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
int getnumber(char text[50] = "Input number:") {
int valid, num;
char buf[500];
while (1) {
puts(text);
valid = scanf("%9d%1[^\n]", &num, buf);
fflush(stdin);
if(valid == 1) return num;
}
}
scanf() возвращает количество удачно (!) прочитанных элементов.
если ты просил "%d"(целое число) и ввел "10", то вернет 1.
если просил "%d%d" и ввел "15 12", то вернет 2.
надеюсь тут понятно.
теперь по косякам:
1. если ты просил "%d", а ввел "abcde" то он вернет 0.
поэтому стоит сделать проверку типа:
int valid = scanf("%d", &num);
if (valid == 1) { УСПЕХ }
2. если ты просил "%d", а ввел число больше 2^32 (или меньше -2^32), то происходит переполнение int и число меняет знак
например:
2147483646 = 2147483646
2147483650 = -2147483646
4294967299 = 3
для этого стоит сделать ограничение на количество цифр:
scanf("%9d", &num); // считывает девятизначное число
scanf("%5d", &num); // считывает пятизначное число
в остальных случаях возвращает 0 (см. предыдущую проверку)
3. если ты просил "%d" и ввел "10abcd", то вернет 1 и num = 10.
для этого нужно делать так:
char buf[500];
scanf("%9d%1[^\n]", &num, buf);
ну и после каждого scanf() надо делать
fflush(stdin); для windows
fpurge(stdin); для os x/linux
для очистки буфера и защиты от зацикливания
рабочий вариант кода в самом начале