`
void avgOfArray()
{
float avg = 0, *ptr = 0;
ptr = (float*)malloc(5*sizeof(float));
printf("Enter 5 numbers: \n");
for(int x = 0; x < 5; x++) {
ptr[x] = getchar();
while ((ptr[x] = getchar()) != EOF && ptr[x] != '\n');
}
for (int y = 0; y < 5; y++) {
avg = avg + ptr[y];
}
avg = avg / 5;
printf("Average = %0.2f \n", avg);
system("pause");
}
`
我正在学习课堂上的指针,并且要求获得5个数字的平均值。无论输入如何,每个输出都是10。如果有人能够解释这个问题,我将非常感激。
答案 0 :(得分:1)
AttributeError Traceback (most recent call last)
<ipython-input-70-ae173d1b923c> in <module>()
----> 1 times['female_male_ratio'].apply(convertGender)
C:\Users\Aslan\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
2353 else:
2354 values = self.asobject
-> 2355 mapped = lib.map_infer(values, f, convert=convert_dtype)
2356
2357 if len(mapped) and isinstance(mapped[0], Series):
pandas\_libs\src\inference.pyx in pandas._libs.lib.map_infer (pandas\_libs\lib.c:66645)()
<ipython-input-69-3584a8e2ceb3> in convertGender(x)
1 def convertGender (x):
----> 2 a, b= x.split(':')
3 c = int(a)/int(b)
4 return c
AttributeError: 'float' object has no attribute 'split'
返回角色的代码,而不是浮动本身。
由于你的循环扫描字符直到遇到getchar
(ASCII码= 10),你总是得到10(浮动)。
不要重写浮动扫描,使用\n
获取一行(文件结尾或fgets
自动处理的问题),然后从行缓冲区扫描5个浮点数,或者使用{ {1}} 5次带空格
\n
答案 1 :(得分:0)
Don't cast malloc
,并检查malloc
的返回值(如果是)
返回NULL
,你无法访问内存,否则它是未定义的行为。
float *ptr = malloc(5 * sizeof *ptr);
if(ptr == NULL)
{
fprintf(stderr, "Not enough memory\n");
return; // or exit or whatever
}
另请注意,当大小为时,通常需要动态分配空间
在编译时不知道,因为用户输入大小或必须
计算。在您的示例中,您已经知道大小,不需要malloc
。
float arr[5];
就足够了。
getchar();
返回单个字符。角色的价值是
由ASCII table确定。 '1'
的值与。{1}}的值不同
值1,因为'1'
是49.你必须阅读所有形成的字符
编号,然后使用float
或scanf
等函数将其转换为strtof
。
备选方案1:使用scanf
。
// assuming you are using ptr = malloc(...)
for(size_t i = 0; i < 5; ++i)
{
while(scanf("%f", ptr + i) != 1)
{
// clear buffer
int c;
while((c = getchar()) != '\n' && c!= EOF));
if(c == EOF)
{
// cannot continue doing scanf
free(ptr);
return; // or exit
}
printf("Please re-enter the number:\n");
}
}
备选方案2:使用fgets
char line[50];
for(size_t i = 0; i < 5; ++i)
{
while(1) // continue reading if value is not a float
{
if(fgets(line, sizeof line, stdin) == NULL)
{
// cannot continue reading
free(ptr);
return; // or exit
}
char *end;
float val = strtof(line, &end);
if(*end == '\n' || *end == '\0')
{
ptr[i] = val;
break; // exit while(1) loop, continue reading next value
} else
printf("Please re-enter the number:\n");
}
}
最后,请不要忘记使用free(ptr);
释放内存。