为什么函数get()不能工作并跳过用户输入?

4
#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{
    char aa[35];
    int a;
    scanf("%d",&a);
    gets(aa);
    puts(aa);
}

它不能从用户获取字符串,但如果我在整数值之前获取字符串,则可以正常工作。


你尝试给程序什么输入?如果 scanf 失败,请尝试使用 clearerr 清除流错误。 - paddy
gets 可能读取了 scanf 之后留下的换行符。此外,永远不要使用 gets,因为没有办法防止缓冲区溢出。请改用 fgetsgets 的手册页面明确说明不应该使用它。 - Tom Karzes
请注意,任何带有gets的程序都可以被用户输入崩溃或利用。换句话说,不要使用gets。例如,使用fgets。 - hyde
4个回答

0

有关缓冲 IO 的更多信息,您应该在此情况下搜索 Google,因为当您首先输入一个数字时,您还必须按“Enter”,这意味着在接受数字后会留下一个“\n”字符 因此,在输入任何字符串之前,请记住清除缓冲 IO,有两种方法可以做到这一点 Flush(stdin);_flushall();


可能需要查看使用fflush(stdin) - chux - Reinstate Monica
是的,双 f,我的错误。 - Always ask

0
尝试再放置一个 gets():
gets(aa);
gets(aa);

0

一旦scanf("%d",&a);stdin中获取数字字符以形成aint,它就完成了。它不会消耗可能跟随其后的'\n'

gets(aa);会消耗数据直到'\n'

因此,像下面这样输入1 2 3 x y Enter,将把123放入a,并将"xy"放入aa

scanf("%d",&a);
gets(aa);

输入如4 5 6 Enter将会把456放入a中,而将""放入aa中。


建议使用fgets()并添加错误处理。
if (fgets(aa, sizeof aa, stdin) == NULL) Handle_EOF();
if (sscanf(aa, "%d", &a) != 1) Handle_Nonnumeric_Input();

if (fgets(aa, sizeof aa, stdin) == NULL) Handle_EOF();
aa[strcspn(aa, "\n")] = '\0'; // truncate potential \n

-1
在scanf和gets之间使用fflush来清除缓冲区。这样可以完美地解决问题。
#include<stdio.h>
void main()
{
    char aa[20];     
    int b;
    scanf("%d",&b);
    fflush(stdin);
    gets(aa);
    puts(aa); 
    getchar();
}

建议您不要使用gets()函数,因为它无法验证内存大小。

1
可能需要查看使用fflush(stdin) - chux - Reinstate Monica

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