2

私はこの構造体を持っています

typedef struct grade
{
    char firstName[SIZE];
    char lastName[SIZE];
    int stuNum;
}GRADE;

そしてこの出力コード:

void printData(GRADE grade[], int used)
{
    int i;
    for(i=0; i<used-1; i++)
    {
        printf("%s %s %d\n", grade[i].firstName, grade[i].lastName, grade[i].stuNum);
    }
}

文字列を印刷しようとすると、文字列の最初の文字のみが印刷されます。私は立ち止まっており、残りの文字列を印刷する方法を実際には理解できません。

このコードは、データ ファイル ("Firstname Lastname StudentNumber"たとえば、約 17 行の形式です) を読み取ります"Mark Markinson 1234" newline "blah blah 1234"

void readData(FILE *infile, GRADE grade[], int *count)
{
    char buf[SIZE] = {0};
    int position=*count;
    int used = 0;
    while( fgets(buf, SIZE, infile))
    { 
        removeNL(buf);

        grade[position].firstName[0] = parseName(buf, &used);
        used++;

        grade[position].lastName[0] = parseName(buf, &used);
        used++;

        grade[position].stuNum = parseNumber(buf, &used);
        used = 0;
        position++;
    }
    *count = position;

}

これは名前のバッファを解析するコードです:

char parseName(char *str, int *place)
{
    char buf[SIZE] = {0}, name;
    int i=*place,j=0;

    while( str[i] != '\0' && !isspace(str[i]))
    {
        buf[j++] = str[i++];

    }
    buf[j] = '\0';

    *place = i;

    return *buf;
}

ここでいくつかの提案を行った後、コードの一部を変更しましたが、それでも同じことを行います(最初の文字のみが出力されます)

この方法を使用して関数を呼び出しました

parseName(buf, &used, grade[position].firstName);

そしてparseNameは今です

void parseName(char *str, int *place, char *firstName)
{
    char buf[SIZE] = {0}, name;
    int i=*place,j=0;    
    while( str[i] != '\0' && !isspace(str[i]))
    {
        buf[j++] = str[i++];

    }
    buf[j] = '\0';

    *place = i;

    *firstName = *buf;
}
4

3 に答える 3

3

return *buffirstNamebuf の最初の文字を (ちょうど) 返します。これは、 andlastName配列に格納しているすべてです。問題は、C では配列が第一級の型ではないため、配列を引数として関数に渡したり、戻り値として返すことができないことです。

あなたがおそらくやりたいことはparseName、ローカルバッファを使用するのではなく、バッファにポインタを渡して埋めてもらうことです。firstName次に、またはlastName直接渡すだけで、これらのフィールドの先頭へのポインターになります。

于 2011-05-10T03:54:48.000 に答える
1

問題はここにあります:

void readData(FILE *infile, GRADE grade[], int *count)
{
    char buf[SIZE] = {0};
    int position=*count;
    int used = 0;
    while( fgets(buf, SIZE, infile))
    { 
        removeNL(buf);

        grade[position].firstName[0] = parseName(buf, &used);
        used++;

        grade[position].lastName[0] = parseName(buf, &used);
        used++;

        grade[position].stuNum = parseNumber(buf, &used);
        used = 0;
        position++;
    }
    *count = position;

}

parseName を呼び出すときは、最初の文字を設定するだけです。配列 (文字列を書き込む場所) を parseName に渡す必要があります。

void readData(FILE *infile, GRADE grade[], int *count)
{
    char buf[SIZE] = {0};
    int position=*count;
    int used = 0;
    while( fgets(buf, SIZE, infile))
    { 
        removeNL(buf);

        parseName(buf, &used, grade[position].firstName);
        used++;

        parseName(buf, &used, grade[position].lastName);
        used++;

        grade[position].stuNum = parseNumber(buf, &used);
        used = 0;
        position++;
    }
    *count = position;

}

パラメータを追加して結果を書き込む parseName を変更することを忘れないでください。

于 2011-05-10T03:57:28.153 に答える
1

すべての入力をバッファーに入れて最初の文字を返し、そのparseName文字をfirstName[0]orに割り当てlastName[0]、バッファーに入れられた残りのデータに対して何もしません。1文字しか印刷されていないのも不思議ではありません。

あなたはおそらくあなたの

grade[position].firstName[0] = parseName(buf, &used);

parseName(grade[position].firstName, &used);

の最初の文字を返す理由は特にありませんparseName。の戻り値の型をparseNameto に変更して、少し冗長にする代わりにchar*theを返すことができます (一部の C 関数はそれを行います)。それはより良い設計です。buf*buf

于 2011-05-10T03:54:27.700 に答える