bugfix> c > 投稿

私はクイズを勉強していて、コードを書いているときに問題に直面しました。

私のコードは 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!");

}

回答 1 件
  • まず、 gets を使用しないでください  安全ではないからです。より安全な代替手段は fgets です 。

    それを使っても、 scanf を混ぜて  および fgets  前者は入力バッファに改行を残し、後者がその改行を読み取ると停止するため、問題が発生します。

    scanf に変更  文字列を読み取るには:

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

    フォーマット指定子 %49[^\n]  最大49の非改行文字を読み取るように指定します。

あなたの答え