NetBeans中scanf函数无法正常工作的程序

7
我今天安装了NetBeans 7.0.1,当我尝试执行带有“scanf”的C程序时,它会给出奇怪的错误。这是我的代码: Program 程序会一直运行,直到我在输出控制台中输入一些内容: enter image description here 在输入之后,它显示printf语句并显示“RUN FAILED”: enter image description here 请问有人能告诉我该怎么做才能解决这个问题吗?

2
一本好的C语言书籍是一个不错的起点... - Nim
我有这个问题,你的问题解决了吗? - Saeed Rahmani
6个回答

11
是的,我和你有同样的问题,而且答案中的解决方法在我的电脑上不起作用。经过搜索,我了解到这个问题与Netbean的内部终端/控制台部分有关。内部控制台无法运行scanf函数。因此,请为您的项目使用外部终端。操作步骤如下:
  • 首先右键单击您的项目,然后选择属性。
  • 在该窗口中,在底部选择“运行”选项卡。
  • 在那里,有“控制台类型”,将此控制台类型从“内部终端”更改为“外部终端”。
这就是全部内容。

对我来说,"无法找到任何有效的 shell" 是一个问题。 - Saeed Rahmani

4
你的printf没有被刷新,因此直到程序结束它才会显示。
你没有明确从main()返回一个值,所以scanf()的结果被返回,这个结果是1,被解释为程序失败。

1
不是这样的。虽然在某些编程语言中是这样的,但在C语言中不是。这里的返回代码是未定义的。在C99中有一个例外,允许您在main()函数中省略return 0;并保证它仍将返回0,但您不能在其他任何地方依赖此行为。 - FatalError
@FatalError - 你说得对,返回值和退出码是未定义的。有一些 C 语言实现(我不知道现在是否还有)会将未定义的值设置为函数结束前计算的最后一个结果。 - antlersoft
啊,好的,我明白你的意思了。起初我以为你是在暗示那是一个功能 : )。我很容易看出它在实践中可能会发生。 - FatalError

1
如果在 main 函数结尾处没有返回 0,程序会认为出现了错误。因此请务必返回 0。

谢谢,那个方法可行,但我的主要问题是printf在我输入控制台之前不会加载。 - Naresh

0

你没有返回0,这表示成功终止操作系统,也没有在你的printf后面加上一个尾随的\n,导致该行未打印(stdin被缓冲):

#include <stdio.h>

int main()
{
    int n;
    printf("Enter the number:\n");
    scanf("%d", &n);
    return 0;
}

0

一个没有返回值的C程序将导致未定义的行为(这被一致认为是一件坏事©)。编译器在此处允许自由返回,它似乎返回scanf()的结果,但对于C标准来说,它可能会返回一些大气熵。

至于该行未打印的原因,那是因为你在缓冲终端上使用printf(),你需要在末尾添加\n。这背后的原因可以追溯到古老的Unix方式,现在只有最明智的Unix大师才记得。

至于在输入之前什么都不发生,那是因为scanf()会阻塞直到接收到输入,如果你还不知道的话。虽然可以使用非阻塞IO调用,但我不确定这是否在你的问题范围内。(请定义“使其正确”)。


-1

添加返回代码。 main() 返回一个 int,因此在您的 main() 函数底部添加 return 0;。目前,返回的值是垃圾值,通常除了 0 以外的任何值都表示失败。

另外,您可能需要考虑将其改为:

int main(void)

更明确地说(虽然这里不会改变任何东西)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接