C - gets 函数无法工作

3

我在使用gets()函数时遇到了问题。 问题是它应该只会有一个未使用变量的警告,但第一个gets()却直接跳到了第二个。

int addClube(char *fileName)
{

        char qClube2[100], qClubeSimple[100], qEstadio[100], qCompleto[500],qAcronimo[100];
        int option=0;

        printf("\n  Indique o nome completo do clube:\n  (sem acentos)\n  ");
        gets(qClube2);

        printf("\n  Indique o nome simplificado do clube:\n  (sem acentos)\n  ");
        gets(qClubeSimple);

        printf("\n  Indique o acronimo do clube:\n  ");
        scanf("%s",qAcronimo);

        printf("\n  Indique o nome do estadio:\n  ");
        gets(qEstadio);

        return option;
}

函数开始时我得到的输出:
Indique o nome completo do clube:
(sem acentos)

Indique o nome simplificado do clube:
(sem acentos)    

再次感谢您的帮助,如果您需要更多信息,请告诉我。

1
在调用此函数之前,您可能使用了 scanf("%d" - M.M
5
gets本质上是不安全的,无法修复,应该使用fgets来替代。 - Sergey Kalinichenko
是的,我在从菜单导航时使用了 with,但是我该如何解决这个问题呢? - Rafael Botas
1
scanf("%s",qAcronimo); 会在 stdin 中留下结尾的 '\n',后续使用 gets() 时会将其作为空行消耗掉。所以最好使用 fgets() - chux - Reinstate Monica
2个回答

1
如果您需要清除输入流,fflush(stdin)无法完成任务。据我了解,它可以在Windows上工作,但在大多数其他系统(UNIX、Linux)中,它是未定义的行为。
我现场写了这个,所以它可能有效也可能无效,但基本上您需要丢弃所有不需要的数据。以下代码可以丢弃输入缓冲区中的一行。
void clearinline(void)
{
    int c;
    do {
        c = getchar();
    } while(c != '\n' && c != EOF)
}

-3

尝试在所有的gets()之后使用fflush(stdin);查看此处。 另外,你为什么要使用这个选项变量?


谢谢,它起作用了。当stackoverflow允许时,我会投票支持你的答案。 - Rafael Botas
没问题,很高兴能帮到你 :D - Joe Kerr
1
@Rafael Botas这个答案推荐使用fflush(stdin)。这是未定义行为。 - chux - Reinstate Monica
fflush() 用于输出流,而不是输入流。 - PC Luddite
你有解决我的问题的方案吗?@PC Luddite - Rafael Botas
显示剩余2条评论

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