2017-11-21 4 views
1

私のプログラムは3つの学生情報 "id、name、およびmarks"をとり、最初のループは期待通りに実行され、すべての変数は順番に並んでいますが、2番目のループ(など)では、 gets(e[i].stname)をスキップしてください。生徒の名前に関する質問を印刷し、直接ジャンプして第1マークを尋ねます。私はデバッグを使ってみましたが、私の経験はあまり役に立たなかった。ループ内で繰り返されるとき、プログラムは「gets(string)」をスキップしますか?

#include<stdio.h> 
struct stud 
{ 
    int stno; 
    char stname[20]; 
    int stmark[3]; 
}; 
void main() 
{ 
    int n, m, i; 
    struct stud e[3]; 
    for (i = 0; i < 3; i++) 
    { 
     printf("enter the name of number %d student: \n", i+1); 
     gets(e[i].stname); 
     printf("enter the number of student number %d:\n", i+1); 
     scanf_s("%d", &e[i].stno); 
     for (m = 1; m < 4; m++) 
     { 
      printf("enter the mark of module %d \n",m); 
      scanf_s("%d", &e[i].stmark[m-1]); 
     } 
    } 
} 
+0

なぜこれがC++をマークされていますか?そして、使用して要件を取得していますか? – Fang

+1

CやC++に 'gets'という関数はありません。 [get関数はなぜ危険なので、使用しないでください](https://stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it-should-使用されていない)。さらに、火災でCを学ぶためのあなたのソースを燃やすことを検討してください。 – Lundin

+0

@Fang im申し訳ありませんが、それは提案タグでした –

答えて

1

これは、機能のscanfgets家族を混合落とし穴の一つです。

scanf_sの呼び出しは整数値を読み取ります。そのあと、入力バッファに改行を残します。それ以降のscanf_sの呼び出しは、%d形式指定子が先頭の空白文字をスキップするため問題ありません。

しかし、gets関数は、すべての文字を次の改行まで読み込みます。 scanf_sはバッファに改行を残したので、getsはその改行を読み取り、ただちに戻ります。

変更scanf_sからgets呼び出し、%s書式指定子を使用して:

scanf_s("%19s", e[i].stname, sizeof(e[i].stname)); 
+0

正解ですが、正規の重複を使用してください[Cの入力を読み込み/解析する方法は? FAQ](https://stackoverflow.com/questions/35178520/how-to-read-parse-input-in-c-the-faq)を参照して、stdinの末尾の改行文字に関する質問をすべて閉じます。この質問のさまざまな味は以前何度も聞かれました。 – Lundin

+0

@ Lundin私はstackoverflowとプログラミングに新しいので、私は一般的な質問amapを求めないようにしようとします。私は実際にはどちらが一般的であるか珍しいか分かりません。 –

+0

@ Khoa.Huynhええ、それは初心者として判断するのは難しいかもしれません。害はありません、私たちは重複した質問を残したくありません。ここのCタグにはCプログラミングのFAQがあります:https://stackoverflow.com/tags/c/info – Lundin

関連する問題