1

我正在尝试使用单独的函数来输入数据scanf()(在 之外main)。这个新功能应该打印一行,然后接收用户的输入。然而,函数scanf中的函数和我正在测试它的函数之间似乎出现了问题。printf()main

我相信我收到了来自函数的指针,但某些编译器警告让我怀疑我对指针的假设是否正确。

我对这段代码的输出感到困惑:

#include <stdio.h>
void set_Info(void);

int main()
{
int scanNum = 0;
set_Info();

printf("%d", &scanNum);
return 0;
}

void set_Info(void)          /* start of function definition */

{
int scanNum;

printf("Scan test, enter a number");
scanf("%d",&scanNum);
}

如果我提供一个数字,比如 2,main() 中 printf 语句的结果是:

2665560

现在,据我所知,输出在我看来就像一个内存地址,所以我试图解决这个问题是取消引用 main 中的指针,如下所示:

int scanNum = 0;
int scanNumHolder;

set_Info();

scanNumHolder = *scanNum;
printf("%d", &scanNumHolder);

我相信这段代码会使scanNum变量分配给scanNum. 但是,当我这样做时,我会得到与上面相同的输出。这使我相信两件事之一。要么我没有正确取消引用scanNum,要么scanNum在这种情况下实际上根本不是指针。

我从编译器收到的最常见错误是:

error: invalid type argument of unary ‘*’ (have ‘int’)

我想,如果我试图将int值视为指针,这是有道理的。

如果scanNum是没有正确取消引用的情况,我该如何实现?

感谢您的帮助

*更新

谢谢您的帮助。

只是回顾一下

我的 set_info 函数需要传递一个地址参数。必须使用地址参数的原因是函数的本地内存在函数调用结束后被擦除。因此,为了完成在主函数中声明的变量,我传递了相关变量的地址,以便在函数结束时不会丢失更改。

在主函数内部,当使用 &scanNum 作为参数调用 set_info 时,它会传递一个引用 tp 变量,以便可以为其分配函数中 scanf 语句生成的值。

我意识到我做错了什么,正如 SO 的真棒人正确指出的那样,我试图调用 set_info 就像它返回一个值一样,但实际上改变了我真正想要的变量。

再次感谢您的帮助!

4

3 回答 3

3

这个功能:

void set_Info(void)
{
    int scanNum;
    scanf("%d", &scanNum);
}

从标准输入中读取整数并将其存储到scanNum变量中,该变量是具有自动存储持续时间的局部变量,仅存在于该函数的范围内。

还有你的身体main

int scanNum = 0;
set_Info();

printf("%d", &scanNum);

定义一个名为 的局部变量scanNum,然后调用一个set_Info()不会以任何方式影响scanNum定义的函数,main然后打印scanNum变量的地址。


这就是你想要做的:

void set_Info(int* num)
{
    // read an integer and store it into int that num points to:
    scanf("%d", num);
}

int main()
{
    int scanNum = 0;
    // pass the address of scanNum to set_Info function so that
    // changes to scanNum are visible in the body of main as well:
    set_Info(&scanNum);
    printf("%d", scanNum);
    return 0;
}

我还建议您在继续编程之前花更多时间阅读一些有关 C 基础知识的书 :)

于 2013-02-28T18:16:57.823 回答
2

我会将变量传递到您的 set_Info 函数中,以便它知道将数据保存在哪里。然后,这将允许您扫描多个值,并且您将简单地增加指针。确保使用 &variableName 将变量地址传递给 set_Info(),因为该函数需要一个指针

#include <stdio.h>
void set_Info(int *pScanNum);

int main()
{
    int scanNum = 0;
    set_Info(&scanNum);

    printf("%d", scanNum);
    return 0;
}


//Pass in the pointer to scanNum
void set_Info(int *pScanNum)
{
    printf("Scan test, enter a number");
    scanf("%d",pScanNum);
}
于 2013-02-28T18:25:22.410 回答
1

摆脱你的&符号!Printf 想要一个整数而不是指针。

printf("%d", scanNum);

正如 liho 所说,您需要从 set_info 返回 scanNum ,以便您可以在函数之外获取它。

int scanNum = set_Info();
于 2013-02-28T18:16:55.347 回答