需要使用malloc进行作业分配,但输出总是读取10.00

时间:2018-02-26 01:45:09

标签: c arrays pointers malloc

`

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。如果有人能够解释这个问题,我将非常感激。

2 个答案:

答案 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
}

另请注意,当大小为时,通常需要动态分配空间 在编译时不知道,因为用户输入大小或必须 计算。在您的示例中,您已经知道大小,不需要mallocfloat arr[5];就足够了。

getchar();返回单个字符。角色的价值是 由ASCII table确定。 '1'的值与。{1}}的值不同 值1,因为'1'是49.你必须阅读所有形成的字符 编号,然后使用floatscanf等函数将其转换为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);释放内存。