【问题标题】:scanf function not working on GCC ubuntu [closed]scanf 函数在 GCC ubuntu 上不起作用 [关闭]
【发布时间】:2018-12-15 07:41:03
【问题描述】:

时隔近 10 年,我开始编写 C 代码。我正在教我姐姐,但不幸的是,我在 Ubuntu 上遇到了一个非常基本的 scanf() 函数,用于一个简单的兴趣程序。

我的程序没有给出任何编译错误,但它没有在屏幕上显示任何内容

代码如下:

#include <stdio.h>
int main()
{
    int p,n;
    float r,si;
    printf("enter values of p,n,r");
    scanf("%d %d %f",&p,&n,&r);
    si = p*n*r/100;
    printf("%f" , si);
    return 0;
 }

【问题讨论】:

  • “scanf ... 不工作”是什么意思?你从不检查返回值,那你怎么知道它不起作用?
  • 它对我有用!输入以空格分隔的值,而不是逗号
  • 您可能看不到输出,因为它与下一个 shell 提示符位于同一行。在末尾添加换行符:printf("%f\n", si)
  • 几个答案建议打印换行符或在第一次 printf 调用后调用 fflush(stdout)。这当然是个好主意,但是在我的 Ubuntu 系统上,当我从 shell 提示符运行程序时,程序在没有它的情况下运行;提示打印正确。并且打印了答案,但没有换行符,因此下一个 shell 提示符出现在同一行。当您说它“不显示任何内容”时,您的意思是“输入值...”提示没有出现吗?你究竟是如何运行程序的?
  • 明确:是否出现“输入值”提示?如果是这样,那么您“它没有在屏幕上显示任何内容”的说法是不正确的。如果没有,那么您在程序到达scanf 之前就遇到了问题,因此您不应该认为scanf 是问题所在。

标签: c ubuntu gcc scanf


【解决方案1】:

当尝试一个接一个地printf()scanf() 时,这是一个常见的“问题”。操作系统缓冲stdinstdout 以提高性能,并且仅在必要时刷新它们。您可以通过在printf() 之后立即调用fflush(stdout); 来显式刷新标准输出。

C/C++ printf() before scanf() issue

你的代码最终看起来像

#include <stdio.h>
int main()
{
    int p,n;
    float r,si;
    printf("enter values of p,n,r\n");
    fflush(stdout); // Force stdout to be flushed
    scanf("%d %d %f",&p,&n,&r);
    si = p*n*r/100;
    printf("%f" , si);
    return 0;
 }

【讨论】:

  • fflush(stdout) 一样重要或更重要的是在printf() 语句的末尾添加一个换行符。这样可以以合理、及时的方式将输出输出到屏幕上。您也可以添加 fflush(stdout) — 但换行符仍然是个好主意。 (并且打印输入值也是一个好主意,检查 scanf() 是否返回 3 也是一个好主意,因为如果没有返回 3,则说明您在计算中遇到了输入失败和未初始化的变量。)
【解决方案2】:

您的代码在我的 Ubuntu 系统中完美运行。这可能是因为您使用的 IDE 错误。

尝试以这种方式在Ubuntu 中运行代码:-

  • 在桌面上将文件另存为program.c
  • 打开终端并输入cd Desktop(导航到桌面)
  • 通过键入gcc -o program program.c 编译代码。
  • 输入./program运行程序。

【讨论】:

  • 所以你建议 OP 只是编译程序,而不是实际运行它?这是有道理的,但如果这就是你的意思,你可以更清楚地说出来。
  • 我认为问题不太可能是由有缺陷的 IDE 引起的。
  • 我在代码块方面也有类似的经历。
  • 这并不意味着 IDE 有问题。
【解决方案3】:

当你说

屏幕上没有显示任何东西

(强调添加),我认为您的意思是当您运行它时,它不会显示您正在打印的数据输入提示。这是因为标准输出在连接到终端时默认是行缓冲的——它会在打印之前在内存中缓冲输出,直到缓冲区被填满,或者(因为 line 缓冲) 输出换行符,或关闭流(包括程序正常终止时)。

因此,显示提示的一种方法是在其上附加一个换行符:

printf("enter values of p,n,r\n");

另一种是使用自动追加换行符的输出函数:

puts("enter values of p,n,r");

如果您想确保即使没有发送换行符也能显示输出,那么您可以刷新流(在这种情况下为标准输出):

printf("enter values of p,n,r: ");
fflush(stdout);

【讨论】:

    【解决方案4】:

    我认为您只是没有正确查看控制台。输出“si”与您的第一个 printf 打印在同一行,因为您没有在其末尾插入换行符。

    【讨论】:

    • 用户输入行末尾会有换行符。
    • 他们可能没有看到它,因为它与下一个 shell 提示符在同一行。
    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多