【问题标题】:Function does not return any value in C函数在 C 中不返回任何值
【发布时间】:2015-03-05 15:15:14
【问题描述】:

我正在尝试在 C 中进行计算并尝试返回数学计算的结果值,但在传递给主函数时没有任何内容打印到屏幕上。我尝试了各种方法,但缺少一些东西。你能帮我更正代码吗?这将有助于我将来在将参数传递给 main 时编写更有效的代码?提前致谢!

#include <stdio.h>

#define     PI      3.14159
#define     REM     144.612925

static double Raden_CALC(double imp)
{

    double result;
    result = ((imp + imp) * PI) / REM;
    return result;
}

main()
{

    double number;
    printf("Enter a number: ");

    fflush(stdin);
    scanf("%.4lf", &number);

    Raden_CALC(number);
    printf("\nResult: ", number);
}

【问题讨论】:

  • 您忽略了返回值。该函数不会(不能)改变输入参数。
  • Using fflush(stdin)保持警惕。它充其量是不可移植的。此外,为确保输出及时出现,请确保输出以换行符结尾:printf("Result: %f\n", number);
  • ...因此,例如,您可以(应该)使用fgets()strtod(),而不是依赖这种可怕的未定义行为和唯一不那么可怕的scanf()。跨度>
  • 谢谢大家!我通常不会犯这个错误,但作为一个人,我总是忘记在 printf 中添加 %。再次感谢!

标签: c argument-passing


【解决方案1】:
int main()
{
    double number;
    printf("Enter a number: ");

    fflush(stdin);
    scanf("%.4lf", &number);

    number = Raden_CALC(number); // <-- Assign the return value to number 
    printf("\nResult: %f\n", number); // <-- Add %f to print the number
}

【讨论】:

  • 它仍然无法打印,因为它缺少最后一个 printf 中的 %f
  • 谢谢你们!它帮助很大!我不知道我是怎么忘记在 printf() 中添加 %lf 或 %f 的
  • fflush(stdin) 是未定义的行为,我听说它有一个编译器特定的实现,但是学习它弊大于利。
【解决方案2】:

您没有使用函数中的值...更改:

Raden_CALC(number);
printf("\nResult: %lf", number);

number = Raden_CALC(number);
printf("\nResult: %lf", number);

printf("\nResult: %lf", Raden_CALC(number));

【讨论】:

  • 顺便说一句,格式说明符中的lprintf 是免费的,但对于scanf 则不是。
  • @Deduplicator 是的,我不记得是否需要 l 来打印双精度。
【解决方案3】:

如果你从一个函数返回一些东西,你需要使用返回的值。

double result=Raden_CALC(number);
printf("Result: %lf\n", result);

这可能是一个疯狂的解释,但我会尝试。如果你问某人“请给我一个苹果”,他给了你一个,你会怎么做?在这里你只是忽略它。

【讨论】:

  • 是的,有时我真的忘记在 printf() 中输入 %。非常感谢!
【解决方案4】:

也许你想修改函数中的值传递它的地址并使用指针来改变这样的数据

void Raden_CALC(double *number)
 {
    *number = 2 * (*number * PI) / REM;
 }

然后在main()1

int main()
 {
    double number;

    printf("Enter a number: ");
    if (scanf("%.4lf", &number) == 1)
     {
        Raden_CALC(&number);
        printf("\nResult: %f", number);
     }
    return 0;
 }

另外,不要fflush(stdin),因为它是未定义的行为,并且printf() 不能像您使用它一样工作,您需要像在scanf() 中一样传递格式说明符,然后它将替换为您传递的参数,在本例中为 number

您还应该检查scanf() 是否有效并且输入是否有效,否则您将使用导致未定义行为的未初始化值。

以下内容摘自 C11 标准草案 1570:

7.21.5.2 fflush 函数

概要

   #include <stdio.h>
   int fflush(FILE *stream);
  1. 如果stream 指向输出流更新流,其中最近的 未输入操作,fflush 函数会导致该流的任何未写入数据 被交付到宿主环境中写入文件; 否则,行为未定义。

要达到你认为fflush(stdin)有的效果可以用这个

#define flushinput() do {                                    \
        int chr;                                             \
        while (((chr = getchar()) != EOF) && (chr != '\n')); \
    } while (0)

然后在scanf()ing 之后像使用函数一样使用宏。


1注意main()返回int

【讨论】:

  • 所以对字符和字符串使用 fflush 是最好的吧?就像下面的例子:scanf("%[^\n]", name);刷新(标准输入); printf("名称: %s", name);
  • NO fflush(stdin) 总是错误的,因为 fflush() 只为输出流定义。
  • 是的,但有时会发生错误,例如当要求 4 个人输入他们的姓名时,如果不使用 fflush,则编译器会自动跳过其他 scanf() 并仅打印第一个 scanf。我现在读到它时确实明白了,但有更好的解决方案吗?
  • 这不是真的,你试过吗? scanf() 的唯一问题是它在大多数情况下是如何以错误的方式使用的,忽略它的返回值,并忘记它留下了尾随的 '\n' 字符,这会导致一些奇怪的行为,但你总是可以用 @ 删除它987654341@, fflush(stdin) 完全是错误的。
  • 是的,但是您可以尝试以下代码并提供反馈。因为它完全按照我的假设行事。跳过所有的scanf并打印出所有的printf,甚至没有要求输入remaning 3 scanf。 #include main() { 字符名[50];字符名称1[50];字符名称2[50];字符名称3[50]; printf("请输入您的姓名:"); scanf("%[^\n]", 名称); printf("请输入您的姓名:"); scanf("%[^\n]", name1); printf("请输入您的姓名:"); scanf("%[^\n]", name2); printf("请输入您的姓名:"); scanf("%[^\n]", name3); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 2017-08-12
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多