Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 返回的浮点指针未永久存储数据_C_Pointers - Fatal编程技术网

C 返回的浮点指针未永久存储数据

C 返回的浮点指针未永久存储数据,c,pointers,C,Pointers,我正在用C编写一个简单的程序,将浮点输出为int和hex,等等 对于这项任务,我不允许更改任何主要内容 我有一个函数getNextFloat(&f),它的地址为'float f;'调用scanf获取浮点值,然后返回一个指向新的f值的指针,该值被发送到我的print函数(该函数将浮点值转换为十六进制和其他表示形式) 我的问题是,当我运行程序时,当我在函数getNextFloat中调用scanf并输入一个数字时,如果我在getNextFloat函数中立即打印*f,它会很好地打印,但是如果我在打印函数

我正在用C编写一个简单的程序,将浮点输出为int和hex,等等

对于这项任务,我不允许更改任何主要内容

我有一个函数getNextFloat(&f),它的地址为'float f;'调用scanf获取浮点值,然后返回一个指向新的f值的指针,该值被发送到我的print函数(该函数将浮点值转换为十六进制和其他表示形式)

我的问题是,当我运行程序时,当我在函数getNextFloat中调用scanf并输入一个数字时,如果我在getNextFloat函数中立即打印*f,它会很好地打印,但是如果我在打印函数中返回*f并打印'f',无论我在getNextFloat中输入什么数字,它的值都是0。我不确定为什么没有保存“f”的值,它似乎是getNextFloat的本地值

#include <stdio.h>
#include <stdlib.h>

static char *studentName = "me";

// report whether machine is big or small endian:

void bigOrSmallEndian()
{
        // irrelevant to question; contains code to report 'endian-ness'
}

// note: the following 3 comments are instructions from the teacher
// get next float using scanf()
// returns 1 (success) or 0 (failure)
// if call succeeded, return float value via f pointer:

int getNextFloat(float *f)
{
        float fl;

        scanf("%f", &fl);
        f = &fl;
        printf("%f", *f);
        return *f;
}

void printNumberData(float f)
{
        // note: function is incomplete, trying to fix this pointer thing first

        printf("%10f", f);
        printf("%10x\n", f);
}

// do not change this function in any way
int main(int argc, char **argv)
{
        float   f;
        int     nValues;

        printf("CS201 - A01 - %s\n\n", studentName);
        bigOrSmallEndian();
        for (;;) {
                if(argc == 1)
                        printf("> ");
                nValues = getNextFloat(&f);
                if(! nValues) {
                        printf("bad input\n");
                        while (getchar() != '\n');
                        continue;
                        }
                printNumberData(f);
                if(f == 0.0)
                        break;
                }
        printf("\n");
        return 0;
}
它打印的第一个值是9.000000,它是测试人员对printf的调用,我将该调用放入我的getNextFloat函数中,以显示它正在正确扫描,问题在别处

接下来的两个值显然是调用print函数时存储在f中的值


感谢您提供的见解,不要使用选项卡进行缩进,因为每个编辑器 制表位/制表符宽度设置不同。 例如,为缩进的可读性使用(比如)4个空格

这一行,在getNextFloat()中

这是倒退

应该是:

*f = fl;
int getNextFloat(float *f)
{
        float fl;
        int success = 0;

        success = scanf("%f", &fl);

        // always place literal on left
        // so an error like '=' will be caught by the compiler
        if(1 == success )
        { // then scanf successful
            *f = fl;
            //printf("%f", *f);
        }
        else
        { // else, overwrite possible EOF value in success
            success = 0;
        }
        return success;
} // end function: getNextFloat
请记住,如果扫描成功,任务是返回1,否则返回0

总体而言,该功能应为:

*f = fl;
int getNextFloat(float *f)
{
        float fl;
        int success = 0;

        success = scanf("%f", &fl);

        // always place literal on left
        // so an error like '=' will be caught by the compiler
        if(1 == success )
        { // then scanf successful
            *f = fl;
            //printf("%f", *f);
        }
        else
        { // else, overwrite possible EOF value in success
            success = 0;
        }
        return success;
} // end function: getNextFloat

让我们看看
getNextFloat

int getNextFloat( float *f ) {
        float fl; // declare a stack variable named fl, containing junk at this point
        scanf( "%f", &fl ); // read a value into fl
        f = &fl; // f now points to fl, which is on the stack
        return *f; // return the value of fl truncated to an integer
} // pop fl from the stack, the next thing to be pushed onto the stack will overwrite the contents of what f was pointing to
请记住,作为函数内部的值对
f
进行的任何修改都不会修改函数外部的任何值。此时,f实际上是一个局部变量,除非您取消对它的引用并将其写入
f
所指向的内存(该内存应该是
main
中名为
f
的变量)


您要做的是更改
f=&fl行到
*f=fl

重新检查
getNextFloat()
-它没有做你认为它做的事情…根据注释中的说明,
getNextFloat(float*f)
可以简单地是
返回scanf(“%f”,f)==1(所述函数的有用性留给想象)。哦,humdinger。我现在看到了。我不确定如何处理0或1指令。非常感谢你们两位