我回到C上,只是做了一些小练习,而我偶然发现了这一小题,而无法弄清为什么会这样?
该程序采用9字长的代码示例“ 011112222”。第一个数字是操作代码(0表示+,1表示-,2表示*,3表示/),接下来的4个数字是第一个数字,其他4个是其他数字,因此对于“ 011112222”,结果应为1111 + 2222。
但是我得到一个持续的错误: 在“主要”功能中:
zadatak.c:54:14: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘float *’ [-Wformat=]
printf("%f", result);
如果有人可以阐明这个问题,那就太好了,我将不胜感激。
#include<stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
float* Calculate(char* buffer)
{
int number1, number2;
char *firstPart = (char *)malloc(strlen(buffer));
char *secondPart = (char *)malloc(strlen(buffer));
strncpy(firstPart, buffer+1, 4);
strncpy(secondPart, buffer+5, 8);
number1 = atoi(firstPart);
number2 = atoi(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;
}
答案 0 :(得分:2)
在您的printf
通话中:
printf("%f", result);
%f
格式说明符期望使用double
(或自动转换的float
),但是您要向浮点数传递指针 。您需要取消引用指针以获取float
值:
printf("%f", *result);
但是,您还有另一个问题。
在Calculate
内,您定义了result
,这是您从函数返回的内容,作为指向float
的指针,但是您从未将其设置为指向任何地方。因此,无论何时尝试取消引用该指针,您都在读取未初始化的值并将其用作有效指针。这样做会调用undefined behavior。
没有理由在代码中使用指向float
的指针,因此将{{1}中的result
和main
中的result
从{{ 1}}更改为Calculate
,然后更改float *
以返回float
。
此外,Calculate
函数并不总是以null终止目标字符串,并且float
返回未初始化的内存,因此strncpy
在读取时可以读取已分配内存的末尾弦。您可以使用malloc
而不是atoi
来解决此问题,这将返回初始化为全0的内存。另外,在使用完这些缓冲区后,请确保calloc
。
malloc
答案 1 :(得分:0)
您的代码需要进行很多验证和更改才能可靠,但是我为实现您的最初目的所做的更改很少。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
float Calculate(char* buffer)
{
int number1, number2;
char *firstPart = (char *)malloc(strlen(buffer));
char *secondPart = (char *)malloc(strlen(buffer));
float result;
strncpy(firstPart, buffer + 1, 4);
strncpy(secondPart, buffer + 5, 4);
number1 = atoi(firstPart);
number2 = atoi(secondPart);
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;
}
free(firstPart);
free(secondPart);
return result;
}
int main()
{
char buffer[20];
printf("Insert code word: ");
scanf("%s", buffer);
float result = Calculate(buffer);
printf("%f", result);
return 1;
}