0

このエラーが何度も発生し、修正方法がわかりません。私は C プログラミングが初めてで、本やインターネットを検索してみましたが、あまり助けが見つかりませんでした。ループと構造を使用して成績レポートを印刷するプログラムを作成しようとしています

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

struct Grades
{
    char Name[20];
    char Hrs;
    int ID;
    char ClassName[20];
    char Grade;
    char ClassID[6];
};

int main ()
{
    struct Grades Transcript[6];
    int classCnt = 0;
    int vHrs=0;
    char vGrade[2];
    char vName[20], vCID[6], vClassName[20];

    printf("Enter Students Name: ");
    fgets(vName, 20, stdin);

    do
    {   printf("Enter Class ID; ");
        fgets(vCID, 6, stdin);
        strcpy_s(Transcript[classCnt].ClassID, vCID);
        printf("Enter Class Name: ");
        fgets(vClassName, 20, stdin);
        strcpy_s(Transcript[classCnt].ClassName, vClassName);
        printf("Enter Class Hours: ");
        scanf("%d", &vHrs);
        strcpy(Transcript[classCnt].Hrs, vHrs);         //Problem occurs here
        printf("Enter Class Grade: ");
        scanf("%c", vGrade);
        strcpy(Transcript[classCnt].Grade, vGrade);     //Problem occurs here
        classCnt++;
    }while(classCnt<=6);
}
4

2 に答える 2

1

あなたは実際にここで多くの問題を抱えています:

まず、strcpy()文字列をコピーするために使用されます。文字があり、それを割り当てたい場合は、演算子を使用して簡単に割り当てることができます=。このstrcpy()関数は、割り当てたい文字配列がある場合に使用されます。

だからあなたの最初の問題

strcpy(Transcript[classCnt].Hrs, vHrs);

Hrs構造体からは単なるchar型でありvHrsint型です。次のように簡単に割り当てることができます。

Transcript[classCnt].Hrs = vHrs;

ただし、int缶は缶よりもはるかに多くのデータを保持charできます。これにより、オーバーフローに関する警告が表示されるため、それをリッスンする必要があります(実装に応じて、-128〜127が保持され、-2,147,483,648〜2,147,483,647が保持charされます)。intここで本当に必要なデータ型を決定しHrsintまたはを作成してから、割り当てを実行しますvHrschar

2番目の問題:

scanf("%c", vGrade);

vGrade文字配列(複数の文字で構成されている)として、文字列形式演算子を使用して割り当てる必要があり"%s"ますが、文字列を実行するときは、必要な文字数+ 1( NULLターミネータの場合)。

3番目の問題:

strcpy(Transcript[classCnt].Grade, vGrade);

Gradechar一方、はvGrade配列です。繰り返しますが、タイプを決定する必要があります。文字の「文字列」が必要な場合は、両方の配列にする必要があります。1つの文字だけが必要な場合は、タイプを変更vGradeして、演算子を使用して簡単な割り当てを行い=ます。

于 2013-02-26T02:35:58.127 に答える
0

ここで遭遇しているのは、データ入力エラーです。

構造体メンバー.Hrsのタイプは"char"です。の引数strcpyはです"char *"。次のように考えてください。Acharは、ASCIIで値を表す単一の8バイトの数値です。A"char *"は、文字の配列(またはC言語の文字列)へのポインターです。

上記は伝統的に真実ですが、今日では、ユニコードまたはマルチバイト文字列の場合もあります。どちらの場合でも、必要なのは代入演算子(=)であり、。ではありませんstrcpy

つまり、引数として期待している値の文字列()ではなく、strcpy単一の値()を確認するように指示しているのです。この場合、スキャンした整数の値を直接コピーすることができます。 charchar *scanf

Transcript[classCnt].Hrs = vHrs;

Transcript[classCnt].Grade = vGrade;

とにかく私の意見では、これまでに書かれた最高の本を探しているなら、C言語でチェックしてください:Cプログラミング言語(第2版)-Amazonで利用できるようです(またはあなたが好きな古本で本の売り手)約21ドル(USD)。

于 2013-02-26T02:33:17.423 に答える