2017-01-24 9 views
-1

teste1機能でプログラムはfgetsをコンパイルしません。または少なくともそれが正しく動作していない、それは文字列を入力することはできません、プログラムは "Nome do cliente"を印刷した直後に終了します。fgetsは他のscanfのためにおそらく無視されます

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(); 
} 
+1

だから何が問題なのですか? –

+0

fgetsを動作させるにはどうすればよいですか? – xickoh

+1

コンパイラが誤動作していると主張することには非常に慎重でなければなりません。あなたのコードは、 'scanf()'がどのように整数を読み込むかについて誤った仮定をしています。 –

答えて

1

は、あなたが最後scanf入力のために押されたキーが改行として入力バッファに残されます入力します。 fgets関数はこの改行を読み取り、それが終了したと考えます。

+0

どうすれば修正できますか? – xickoh

+3

@xickoh:いくつかの選択肢があります。一つは、 'fgets()'を使って行を読み込み、 'sscanf()'を使ってそれらを解析することです。おそらくそれが最適です。別の方法として、 'scanf()'の後に文字を改行(またはEOF)するように、 'int c; while((c = getchar())!= EOF && c!= '\ n'); '。それが(問題の)立っているので、ユーザーは '3 4 Frederick Handel'を1行に入力すれば、すべての入力コードを満たすことができます。 'fgets()'と 'sscanf()'を使うと、ユーザが入力したもの(あるいはユーザが何を入力したのか)を制御することができます。 –

+0

@Jonathan Lefflerはfgets()で整数を読み取りますか?私はそのscanf内の単一の整数を読むつもりです – xickoh

関連する問題