2

私は C プログラミングの初心者で、現在大学で授業を受けています。私はこのエラーに遭遇し、何時間も Google を検索した後で修正する方法がわかりません。成績レポートを印刷し、このエラーが発生し続けるプログラムの作成に取り組んでいます。

コードは次のとおりです。

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

int main (void)
{   char Name[20];
    char cid1[5]="", cid2[5]="", cid3[5]="", cid4[5]="", cid5[5]="", cid6[5]="";
    char Description1[20]="", Description2[20]="", Description3[20]="", Description4[20]="", Description5[20]="", Description6[20]="";
    int hrs1 = 0, hrs2=0, hrs3=0, hrs4=0, hrs5=0, hrs6=0;
    char grade1[1]="",grade2[1]="",grade3[1]="",grade4[1]="",grade5[1]="",grade6[1]="";

    printf("Enter Students Name ");
    gets(Name);

    printf("Enter Class ID ");
    scanf("%s", &cid1);

    printf("Enter Class Description ");
    gets(Description1);

    printf("%s", Name);
    printf("%s", cid1);
    printf("%s", Description1);

    system("pause");
}
4

3 に答える 3

3
scanf("%s", &cid1);

電話する必要があります:

scanf("%s", cid1);

また、配列は5要素のサイズで宣言されているため、複数の4文字を渡すと (末尾の をカウントする必要があり\0ます)、未定義の動作が呼び出されます。

于 2013-02-18T22:27:10.913 に答える
2

配列がサポートする分だけ読み取ることができます。char 配列を 5 バイトと宣言する場合 ( char cid1[5])、最大 4 文字を入力できます (5 番目はヌル ターミネータです)。それ以上入力すると、メモリが破損し、そのメッセージが表示されます。

getsまた、入力から文字列を読み取るために使用する関数は、バッファ オーバーフローを回避することが不可能なため、非常に安全ではありません。絶対に使用しないでください。fgets代わりに を使用しstdinます。

于 2013-02-18T22:29:26.730 に答える
0

これが唯一の問題かどうかはわかりませんが、すぐに文字列の割り当てに問題があることがわかります。

C の文字列は一連の char 値として格納され、0 で終了することを思い出してください。つまり、5 桁のコース名を保持するには 6 文字が必要です... { 'C', 'S', ' のようなもの1', '0', '1', '\0' }. これは、文字列として開始された 1 桁の成績には 2 文字が必要であることも意味します。

gets() 関数はそのゼロを文字列の末尾に追加するため、grade1[1] 配列 (一例として) がオーバーフローしています。1 文字を保持すると宣言されていますが、2 文字が書き込まれています。とりわけ、スタックが破損する可能性があります。すべての配列のサイズを少なくとも 1 文字増やします。

もう 1 つの問題は、エラー チェックがないことです。そのため、誰かが 20 文字を超える名前を入力してエラーを引き起こす可能性がありますが、それはおそらく、まだ基礎を学んでいるからでしょう。「実際の」コードでは、おそらく gets() を使用することはありません。

于 2013-02-18T22:34:36.840 に答える