【问题标题】:fgets will be ignored probably due to other scanf's [duplicate]fgets 可能由于其他scanf的[重复]而被忽略
【发布时间】:2017-01-24 14:59:54
【问题描述】:

程序不会在teste1 函数中编译fgets。或者至少它不能正常工作,它不会让我输入字符串,程序将在打印“Nome do cliente”后立即结束。

如果我禁用函数中的其他scanf,它将毫无问题地运行。

如何让 fgets 工作?

#include <stdio.h>
void teste1(){
    char teste[50];
    printf("Nome do cliente\n");
    fgets(teste,50,stdin);
}

void teste2(){
    teste1();
}

void teste3(){

        int opc1,opc2;
        printf("\nSeleccione a área desejada\n1- Clientes\n2- Concessionários\n3- Carros de demonstração\n");
        scanf("%d",&opc1);

        printf("\nSeleccione a área desejada\n1- Inserir\n2- Alterar\n3- Remover\n4- Consultar\n");    
        scanf("%d",&opc2);

    teste2();
}

int main()
{
    teste3();
}

【问题讨论】:

  • 那么...问题是什么?
  • 如何让 fgets 工作?
  • 你应该非常谨慎地声称编译器行为不端——这肯定不是这里的问题;您的代码对 scanf() 如何读取整数做出了错误的假设。

标签: c scanf fgets


【解决方案1】:

您为最后一个scanf 输入而按下的Enter 键将作为换行符留在输入缓冲区中。 fgets 函数会读取这个换行符并认为它完成了。

【讨论】:

  • 我该如何解决这个问题?
  • @xickoh:有几个选择。一种是使用fgets() 读取行,然后使用sscanf() 分析它们——这可能是最好的。另一种方法是使用int c; while ((c = getchar()) != EOF &amp;&amp; c != '\n') ; 之类的代码在scanf() 之后将字符吞噬到换行符(或EOF)。请注意,就目前而言(在问题中),用户可以在一行上键入3 4 Frederick Handel all,这将满足您的所有输入代码。使用fgets() 加上sscanf(),您可以重新控制用户输入的内容(或者您对用户输入的内容执行的操作)。
  • @Jonathan Leffler fgets() 是否读取整数?我只打算在该 scanf 中读取一个整数
  • @xickoh:不,fgets() 读取字符串;这就是为什么您之后使用sscanf() 来分析字符串并将其转换为整数(如果可能的话)的原因。您还可以在错误消息中显示可用的数据:例如,You typed 'Albuquerque' but that cannot be converted to an integer
  • 最快的解决方法是在teste3() 函数中添加我在第二个scanf() 之后显示的while 循环。你想要一行输入;你确保你在一行的开头。你实际上并没有对你读到的名字做任何事情。你至少应该打印出来。您还应该检查输入操作是否有效:if (scanf("%d", &amp;opc1) != 1) { …handle error… }if (fgets(teste, sizeof(teste), stdin) == 0) { …handle error… }
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2021-10-03
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多