【问题标题】:Why is my program skipping the gets() function?为什么我的程序会跳过 gets() 函数?
【发布时间】:2018-05-25 15:28:44
【问题描述】:

我正在为测验而学习,在编写代码时遇到了一个问题。

我的代码跳过了gets() 函数。如果我使用scanf,它不会跳过,但由于我使用scanf 扫描全名会很麻烦,但由于某种原因会跳过gets()

struct Conta{

    char nomeDoCliente[50];
    int numeroDeConta;
    float saldoDeConta;

};
struct Conta conta1;

int main()
{
            switch (menu()){
            case 1 :
                defDadosDeConta();
                break;
            case 2 :
                break;
            case 3 :
                break;

            }
}

int menu(){
    int escolha;
    puts("1 - Definir dados da conta.");
    puts("2 - Depositar Dinheiro.");
    puts("3 - Levantar Dinheiro.");
    puts("4 - Sair.");
    printf("Escolha a sua operação: ");
    scanf("%d", &escolha);
    return escolha;
}
defDadosDeConta(){
    printf("Insira o seu nome: ");
    gets(conta1.nomeDoCliente);
    puts("Dados de conta guardados com sucesso!");


}

【问题讨论】:

  • 可能是因为 scanf 将换行符留在缓冲区中,所以读取一个空行。
  • “跳过”是什么意思?是什么让您认为 gets() 被跳过了?
  • "%d' 表示在第一个非数字处停止并将其留在输入流中。因此该行末尾的换行符仍在等待读取。
  • 初始化客户端名称,例如“未初始化”。然后看看能不能活下来。如果名称以“”结尾,即为空,则 gets() 没有被跳过。

标签: c


【解决方案1】:

首先,never use gets,因为它不安全。更安全的选择是fgets

即使您使用它,混合 scanffgets 也会导致问题,因为前者可能会在输入缓冲区中留下换行符,导致后者在读取该换行符后停止。

改成scanf读取字符串:

scanf("%49[^\n]", conta1.nomeDoCliente);

格式说明符 %49[^\n] 规定最多可读​​取 49 个非换行符。

【讨论】:

  • %49[^\n] 确实解决了我的问题。我认为问题在于,在我为 conta1.nomeDoCliente 制作罐头后,发生了一些背景问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
相关资源
最近更新 更多