【问题标题】:How to use a function containing scanf() in the main function in C如何在 C 的主函数中使用包含 scanf() 的函数
【发布时间】:2017-09-19 13:23:02
【问题描述】:

标题描述了我正在尝试做的事情,但我收到了我从未声明过 base1 的错误消息。我实际上知道这一点,但我不确定如何真正解决这个问题。

int getBase1(void);
int setBase1(double);

int main(void){
    getBase1();
    setBase1(base1);
}

int getBase1(void){
    printf("Please enter the length of a base: ");
    return;
}

int setBase1(double base1){
    scanf("%lf", &base1);
}

【问题讨论】:

  • 编译告诉你base1名称没有定义在main的范围内,这是完全正确的。您可能想详细说明您想要实现的目标。
  • 为什么不传递变量的引用? scanf 将为该引用设置值。
  • @DivyaMamgai C 中没有引用。
  • 因为 base1 没有定义
  • @DivyaMamgai 如果你的意思是“指针”,那么你应该写“指针”。在 C 中,您不能像在 C++ 中那样通过引用传递变量。

标签: c printf scanf getter-setter


【解决方案1】:

必须使用指针,否则方法内的变量不会指向同一个内存地址。使用指针,您将把值放在您在函数调用中传递的变量的内存地址中。 还有一件事,这样你就不需要返回值了。

试试这个方法:

#include <stdio.h>
void getBase1(void);
void setBase1(double *base1);

int main(void){
    double base1;
    getBase1();
    setBase1(&base1);
    printf("%lf", base1);
}

void getBase1(void){
    printf("Please enter the length of a base: ");
}

void setBase1(double *base1){
    scanf("%lf", base1);
}

【讨论】:

  • 这个答案中的函数原型仍然说这些函数应该返回 int 值。 Nitpicks:对于健壮的代码,应该检查来自scanf() 的返回值;虽然%lf 使用printf() 打印double 值并没有错,但不需要l 修饰符,并且对f 转换说明符没有影响(但scanf() 需要它)。
  • @DavidBowling 我的坏人。感谢您的关注。已更正!
  • printf("%lf", base1); -> printf("%f\n", base1);
  • @LethalProgrammer--main() 是一个特例。这里不需要显式的return 语句(C99 起);在这种情况下,如果在没有显式 return 的情况下到达 main() 的结尾,则返回值 0。
  • @GabrielMagri-- int main(void) 很好,因为这是标准认可的main() 的两个函数签名之一。 void main(void) 是依赖于实现的签名,不可移植。
【解决方案2】:

看来您对 C 编程很陌生。这是一件事,如果不使用指针,您根本无法使用 scanf 来修改主函数变量的值。如果你读过scanf,你会发现 scanf 需要一个变量的内存地址;这就是为什么 scanf 能够读取格式字符串并修改您的变量的原因。所以你想要实现的与scanf非常相似,你必须传递base1的地址;首先声明一下!因为这就是编译器正在哭泣的东西。执行以下操作:

  1. 声明并传递要修改的变量的地址。像这样传递base1的地址:

    double base1; getBase1(); setBase1(&base1);

  2. 在函数 getBase1 中,您正在执行 void 返回,但您的函数签名告诉编译器您将返回 int。所以你的函数应该是这样的:

    void getBase1(void); void setBase1(double *);

  3. 由于您的 setBase1 正在接收地址,因此不需要与号 (&)。只需传递接收到的指针值:

void setBase1(double *pBase) { scanf("%lf", pBase); }

【讨论】:

    【解决方案3】:

    您的代码中有很多错误,首先是int main(),应该有返回类型,而您的函数也不会返回任何内容。 base1 未声明。

    error: ‘base1’ undeclared (first use in this function)
         setBase1(base1);
              ^
    

    您的主要功能中的base1 在哪里? 它的基本原理是将base1 作为setBase1 的参数传递,但未声明base1。

    【讨论】:

    • @DavidBowling,我同意。我刚刚也发现了其他错误。我将编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2018-07-04
    相关资源
    最近更新 更多