Использование scanf()
проблематично.Если пользователь набрал -5 +10 -15 -15
в первой строке ввода, а затем нажал return, вы обработали бы 4 числа по очереди с scanf()
.Это, вероятно, не то, что вы хотели.Также, конечно, если пользователь вводит +3 or more
, то первое преобразование останавливается, когда читается пробел, и все последующие преобразования завершаются неудачно на o
или or
, и код переходит в цикл.Вы должны проверить возвращаемое значение из scanf()
, чтобы узнать, удалось ли что-либо преобразовать.
Проблемы с чтением вперед достаточно серьезны, поэтому я бы выбрал квазистандартную альтернативу использования fgets()
прочитать строку данных, а затем с помощью sscanf()
(все эти дополнительные s
важны) проанализировать число.
Чтобы определить, имеет ли число с плавающей запятой дробную часть и целое числочасть, вы могли бы использовать функцию modf()
или modff()
- последняя, поскольку ваш adj
является float
:
#include <math.h>
double modf(double x, double *iptr);
float modff(float value, float *iptr);
Возвращаемое значение является знаковым дробнымчасть x
;значение в iptr
является целочисленной частью.Обратите внимание, что modff()
может быть недоступно в компиляторах (библиотеках времени выполнения), которые не поддерживают C99.В этом случае вам, возможно, придется использовать double
и modf()
.Однако, вероятно, так же просто ограничить пользователя вводом целых чисел в формате %d
и целочисленного типа для adj
;это то, что я бы сделал с самого начала.
Еще один момент: вы действительно хотите подсчитать недействительные числа в общем количестве попыток?
#include <stdio.h>
#include <math.h>
int main(void)
{
int counter=0;
int ttl=100;
printf("You all know the rules now lets begin!!!\n"
"\n\nWe start with 100. What is\n");
while (ttl != 5)
{
char buffer[4096];
float a_int;
float adj;
printf("YOUR ADJUSTMENT?");
if (fgets(buffer, sizeof(buffer), stdin) == 0)
break;
if (sscanf("%f", &adj) != 1)
break;
if (adj<=20 && adj>=-20 && modff(adj, &a_int) == 0.0)
{
counter++; // Not counting invalid numbers
ttl += adj;
printf("The total is %d\n", ttl);
}
else
{
printf ("I'm sorry. Do you not know the rules?\n");
}
}
if (ttl == 5)
printf("The game is won in %d steps!\n", counter);
else
printf("No-one wins; the total is not 5\n");
return(0);
}
Понятно, я 'Я старательно игнорирую возможность того, что кто-то может набрать более 4095 символов перед вводом return.