2016-04-05 21 views
2

私はファイル処理プロジェクトに取り組んでいました。ここでユーザーは何回入力を行いたいのかを指定し、その内容はファイル形式で表形式で保存されます。私のコードは:このループの振る舞いを把握できません

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    int n; 
    FILE *fptr; 
    fptr=fopen("input.txt", "w"); 

    if(fptr==NULL) 
     printf("The file could not be opened."); 

    printf("\nFile opened successfully."); 

    printf("\nHow many inputs do you want to make?"); 
    scanf("%d", &n); 

    printf("\nEnter contents: \n\n"); 

    char name[50]; 
    int age; 
    float salary; 
    int i; 

    for(i=1;i<=n;i++) 
    { 
     printf("\nName(Not more than 50 character): "); 
     gets(name); 

     if(name[strlen(name)-1]=='\n') 
      name[strlen(name)-1]='\0'; 

     printf("\nAge: "); 
     scanf("%d", &age); 

     printf("\nSalary: "); 
     scanf("%f", &salary); 

     fprintf(fptr, "%s\t\t%d\t$%.2f\n", name, age, salary); 
    } 
} 

私が遭遇する問題は、ループが正しく実行されないことです。私は名前を入力することはできません。それは名前をスキップし、年齢の入力を取るために直接進んでいます。私は、だから私は、私はここにいくつかの助けを得ることができると思います。よろしく。

+0

おそらく、コンパイラ警告を有効にします。単純なタイプミスとして閉じる投票。 – Lundin

+1

そして、C言語には 'gets 'という関数はなく、17年前に廃止され、5年前に完全に削除されました。あなたのCの学習の源は、時代遅れです。 – Lundin

+0

これはタイプミスでした。それを指摘してくれてありがとう。名前を呼び出す必要はありません。 – Masquerade007

答えて

0

試してみてください。無駄にするfgets()、scanf関数( "%の[^ \ n]は、S、名前を)しようとしたために働い

scanf ("%s", &name); 

そうでないなら、私...、それはあなたを与えると私はより多くのを助けるためにしようとする出力を投稿してください。

をまた、間違いなくWhozCraigさんのコメントを見ると、あまりにもそのバグを修正。

+0

scanfスペース。私は最初にそれを試して、名前の最初の部分だけを保存しました。そしてそれは私がループを省いたときだった。 – Masquerade007

5

あなたが

を行うループの前に
scanf("%d", &n); 

それは数字を読み上げますが、入力を終了する改行ではなく、改行を入力バッファに残します。あなたは

gets(name); 

を行うときにループ内では、空行としてその改行を読み込みます。以前のscanf呼び出しから、改行文字を含むすべての左端の文字をスキップする必要があります。たとえば、改行を読むまで、一度に1文字ずつ読むループを作ることができます。


注:getsを使用しないでください。それは危険で、C99標準から非難されており、最新のC11標準では完全に削除されています。推奨交換はfgetsです。

+0

ええ、私は以前のプロジェクトで多くの問題を引き起こしたので、通常はgets()を使用しません。私はscanf( "%[^ \ n] s"、名前)とfgets(name、sizeof(name)、stdin)で始まりましたが、うまくいきませんでした。それはコードに残った。 – Masquerade007

関連する問題