2017-01-24 6 views
0

私はプログラミングでは新しく、これを趣味として取り上げました。だから私は運動を解決し始めたが、私のプログラムは突然クラッシュする。プログラムがクラッシュしますか?

敏感な社会クラブが寄付キャンペーンを開催:
これは運動です。キャンペーンをもっと楽しくするために、彼らは部門間の競争を組織します。競技会では、寄付先の学生と部門に証明書が与えられます。

質問: n人の生徒の情報を読み取るプログラムを作成すると、最も多く寄付した学生の名前と平均が最も高い部署が表示されます。

入力の指定:最初に1つの整数(n)が与えられます。すると、次のn行は、3件の情報があります:

学生名:最大で4文字の長い文字列(のみ:名は、わずか26英語(大文字または小文字)の文字彼/彼女の部門を含む最大20文字の文字列です競争の中で3つの部門:CEN、ECEまたはBINF)

出力仕様は:
最も寄贈し、学生の名前、
、平均最高である部門:2つの文字列を表示します。

int n,i,CENc=0,ECEc=0,BINFc=0,CENa=0,ECEa=0,BINFa=0,amountS,amountH=0,avgCEN,avgECE,avgBINF; 
char department[4],name[20],nameH[20]; 
scanf ("%d",&n); 
for (i=0;i<n;i++);{ 
    gets (name); 
    gets (department); 
    scanf("%d",&amountS); 
    if (strcmp(department,"ECE")==0){ 
     ECEa=ECEa+amountS; 
     ECEc++; 
    } 
    else if (strcmp(department,"CEN")==0){ 
     CENa=CENa+amountS; 
     CENc++; 
    } 
    else if (strcmp(department,"BINF")==0){ 
     BINFa=BINFa+amountS; 
     BINFc++; 
    } 
    if (amountS>amountH){ 
      amountH=amountS; 
      strcpy(nameH,name); 
    } 

} 
avgCEN=CENa/CENc; 
avgECE=ECEa/ECEc; 
avgBINF=BINFa/BINFc; 
if (avgCEN>avgECE && avgCEN>avgBINF){ 
    printf("%d", avgCEN); 
    printf("%s", nameH); 
} 
else if (avgECE>avgCEN && avgECE>avgBINF){ 
    printf("%d", avgECE); 
    printf("%s", nameH); 
} 
else if (avgBINF>avgCEN && avgBINF>avgECE){ 
    printf("%d", avgBINF); 
    printf("%s", nameH); 
} 
    return 0 

ので、私はそれがひどく行われますが、ここで問題なのはほとんど知っています。
入力の1行目と2行目にJohnny CEN 500Mark BINF 600と入力し、その後にプログラムがクラッシュします。
それはなぜ起こるかについての考えはありますか?注:私は基本を学び、より複雑なものに時間をかけて進んでいるので、現在は配列を使用したくないです。

+5

[最小限の完全で検証可能な例](http://stackoverflow.com/help/mcve)を入力してください。あなたのコードをそのままコンパイルすることはできません。だから、人々があなたを助けることはずっと難しくなります。 –

+2

'department [4]'です。 Cの文字列にはNULターミネータが含まれています。したがって、 "BINF"は配列に5つの 'chars'を格納する必要があります。 – kaylum

+0

そして 'gets'を使用しないでください。それは、[マニュアルページを手に入れる](https://linux.die.net/man/3/gets)にあることを伝えます。 – kaylum

答えて

0

第2入力として入力します。Mark BINF 600、今部門はヌル文字\0を含む4文字しか持っていません。だからchar department[4]char department[5]に変更してください。

また、この回答から。What does gets() save when it reads just a newline On Workingのgets()getsの説明で

この部分は混乱するかもしれません:

それはまでのすべての文字を取ります(は含まない)改行

ということを言って良いかもしれないすべての文字を含む改行がすべての文字改行を含みません。

ユーザーがsome stringに入るのであれば、gets機能はsome stringを読み、ユーザの端末から改行文字が、唯一some stringバッファ内に格納します - 改行文字が失われます。とにかく誰も改行文字を望んでいないので、これは良いことです。これは制御文字であり、ユーザーが入力したいデータの一部ではありません。

したがって、と入力すると、と入力すると、getsは空の文字列として解釈します。

ので、スタートでは、あなたのオンラインscanf ("%d",&n)に、あなたが入力し、入力してEnterキーを押しますと、改行文字がバッファに格納されているので、実行はgets (name)に到着、getsは、改行文字を読みますそして、空などの文字列を解釈し、前方に移動するので、あなたもこれを行うことが改行文字、

char a ; 
scanf("%d" , &n); 
scanf("%c" , &a); 

だからバッファ内に存在する改行文字が中に保存されます、とされないことを消化するためにgetsによって読まれた。あなたはJohnny CEN 500のような行に入力を与えている場合は、ホワイトスペースを数えないので

また、その後gets()おそらく、単一の文字列でそれのすべてを記憶しています。だからあなたはおそらくそれを望んでいない。

また、コードのこの部分では、おそらく0によって分割されています。

avgCEN=CENa/CENc; 
    avgECE=ECEa/ECEc; 
    avgBINF=BINFa/BINFc; 
関連する問題