C / C ++ BEGINNER - 使用stdin导致意外“循环”结果的fgets

时间:2014-07-13 10:59:10

标签: c netbeans fgets

我是一名编程学生,直到现在才真正看过Java。这个学期是我们第一次使用C而且我在围绕一些最简单的功能时遇到了很多麻烦。我真的不知道我在做什么。我甚至无法让Eclipse与MinGW一起正常工作,所以我最终放弃了并恢复了Netbeans。

所以基本上我正在尝试使用fgets来读取用于切换案例菜单的用户输入,但即使在最简单的情况下我也无法让fgets工作。为了排除故障,我尝试从网上复制一个简单的fgets示例,但即使这样也会给我带来意想不到的结果。

当我运行下面的代码时,它只运行一个无限的空循环(它根本不提示用户输入,它不接受任何用户输入,它只是'永远'运行'并且控制台保持空白)。当我删除fgets行并删除对'name'变量的另一个引用时,它会按预期工作(打印用户输入提示然后结束)。

示例代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {

  char name[10];
  printf("Who are you? ");
  fgets(name,10,stdin);
  printf("Glad to meet you, %s.\n",name);
  return(0);

return (EXIT_SUCCESS);

}

任何建议都将不胜感激!

其他信息: 我正在跑 - 赢8(可怜的我)&amp; Netbeans IDE 8.0(含MinGW)

创建我的C项目时,我选择File =&gt;新项目=&gt; C / C ++ =&GT; C / C ++应用程序

编辑:当我运行程序时,我尝试过: 1)右键单击项目文件=&gt;跑;和 2)单击netbeans功能区中的绿色大箭头;
....既不起作用。

3 个答案:

答案 0 :(得分:0)

此代码应该可以使用,但是为了能够输入任何内容,您需要在适当的终端中运行。

我的猜测是你在IDE中运行它并且它设置为使用管道作为stdin / stdout。相反,您应该启动cmd.exe并在那里运行程序(您必须先导航到正确的目录)。

或者,您可以选择在IDE中使用cmd.exe或使用内置终端运行程序。

最后一点。每当需要缓冲区大小时,您应该学会使用sizeof。即改变这个:

 fgets(name,10,stdin);

 fgets(name, sizeof(name), stdin);

另外,请使用空格使您的代码更具可读性。阅读代码是编程的重要组成部分。

答案 1 :(得分:0)

1)你可能想在printf之后刷新文件(&#34;你是谁?&#34;);用fflush(stdout);

2)你有两个return语句(无害)。

除此之外,您的代码还可以。

答案 2 :(得分:0)

效果很好 - 但您可能希望在fflush(stdin);来电之前使用fgets()。 还记得fgets在用户输入后返回一个带有'\ n'的字符串 - 只用name[strlen(name)-1]='\0';解决 - 这基本上是将NULL作为“字符串结束”符号,基本上你删除'\ n'。 并且不要将10更改为sizeof(name) - 这根本不重要,基本上它甚至可能更糟,因为你不能在函数中正确使用它(sizeof(name)并不总是匹配长度,将是指针的大小)。 您应该尝试使用MinGW进行编译,如果它不起作用,它肯定会对它起作用。 提醒:fgets()可以让您输入数百万个字符,但在这种情况下,至少会输入前10个字符。