В вашем printf
вызове:
printf("%f", result);
Спецификатор формата %f
ожидает double
(или float
, который автоматически конвертируется), но вы передаете его указатель на число с плавающей запятой.Вам нужно разыменовать указатель, чтобы получить значение float
:
printf("%f", *result);
Однако , у вас есть другая проблема.
Внутри Calculate
вы определяете result
, то есть то, что вы возвращаете из функции, как указатель на float
, но вы никогда не устанавливаете его так, чтобы он указывал куда-либо.Поэтому всякий раз, когда вы пытаетесь разыменовать этот указатель, вы читаете неинициализированное значение и используете его в качестве действительного указателя.Это вызывает неопределенное поведение .
Нет смысла использовать указатель на float
в вашем коде, поэтому измените оба result
в main
и result
в Calculate
с float *
на float
и измените Calculate
, чтобы получить float
.
. Кроме того, функция strncpy
не всегда завершает строку назначения нулем, а malloc
возвращает неинициализированную память, поэтому atoi
может читать после окончания выделенной памяти при чтении строк.Вы можете исправить это, используя calloc
вместо malloc
, который возвращает память, инициализированную для всех 0.Кроме того, обязательно free
эти буферы, когда вы закончите с ними.
float Calculate(char* buffer)
{
int number1, number2;
char *firstPart = calloc(strlen(buffer), 1);
char *secondPart = calloc(strlen(buffer), 1);
strncpy(firstPart, buffer+1, 4);
strncpy(secondPart, buffer+5, 8);
number1 = atoi(firstPart);
number2 = atoi(secondPart);
free(firstPart);
free(secondPart);
float result;
if( buffer[0] == '0')
{
result = (float)number1 + (float)number2;
}
else if(buffer[0] == '1')
{
result = (float)number1 - (float)number2;
}
else if(buffer[0] == '2')
{
result = (float)number1 * (float)number2;
}
else if(buffer[0] == '3')
{
result = (float)number1 / (float)number2;
}
return result;
}
int main()
{
char buffer[20];
printf("Insert code word: ");
scanf("%s", buffer);
float result = Calculate(buffer);
printf("%f", result);
return 1;
}