【发布时间】:2017-07-07 06:55:03
【问题描述】:
我正在尝试从fgets() 读取输入,并且该函数不等待输出(从键盘)。我们被告知使用fgets,所以scanf 不是这里的选项。 fgets 函数确实在出于某种原因在 main 函数中使用时起作用,但在附加函数中不起作用。
这是代码
char name[21]={0x0}; //tried everything; not assigning value and NULL&\0
printf("\nName: ");
//fseek(stdin,0,SEEK_END);
//rewind(stdin);
//fflush(stdin); //these don't help
printf(stdin); //for testing purposes, probably pointless
fgets(nimi, 21, stdin);
程序将跳过fgets() 并且不等待输入,然后在我想要名称字符串的地方添加一些空字符串。但是,name 没有得到 NULL 值,因为存在错误检查。我知道有很多人有这个问题,但我没有找到任何帮助。大多数人告诉使用scanf 或其他一些功能。作为记录,scanf() 将在此处按预期工作。语法应该是正确的,因为它适用于main()。我可能什至不知道stdin 的实际工作原理,所以如果标题很愚蠢,我深表歉意。
这个sn-p直接在malloc for指针之后(if else子句)
【问题讨论】:
-
出于测试目的,可能毫无意义....不,这是完全错误的....
-
您是否在此代码之前使用
scanf()? (可能是这个问题)除了printf(stdin);有问题。 -
stdin通常是不可搜索的,所以fseek()和rewind()永远不应该用在它上面。fflush()用于刷新输出,而不是丢弃不需要的输入;如果像典型的那样,stdin未打开以供写入,则fflush()调用将失败并出现错误(您忽略该错误)。即使它可以写入,刷新输出端也无法达到您的目的。简而言之,也不要fflush(stdin)。 -
您的 sn-p 不足以解释您描述的行为。构建一个 minimal reproducible example 来演示问题,如果该练习不能帮助您自己发现问题,请将其编辑到您的问题中。
-
scanf()的输入缓冲区中可能仍有换行符。