0

このエラーの意味がわかりません。プログラムを実行すると、ユーザーが N を入力するまで継続的にループする必要があります (no more/exit)。何が起こっているのかわかりません。最初の一連の入力の後、ユーザーに「新しい学生を処理しますか?」というプロンプトが表示される前に、プログラムはその例外をスローします。

Geany (クラッシュするだけのエラー定義はありません) と Visual Studio 2010 を使用して実行しました。

誰か助けてくれませんか?

void draw_bar_chart(int student_id[], int percentage[], int size)
{
    FILE *report;
    int i, j=0, min = 1000000, max = 0, min_pos, max_pos, l;
    char s[20];

    report = fopen("report2.txt", "a");
    fprintf(report, "\n******* BAR CHART (YEARLY TOTAL EXPENSES: YEARLY TOTAL INCOME) *******\n\n");      

    for (i = 0; i < size; i++)
    {
        fprintf(report, "%d%c", student_id[i], ' ');
        if (percentage[i] > 0){
            l = percentage[i]/10; //the lenght of the bar
            if ((percentage[i]%10) > 0)
                l++;
            for (j = 0; j < l; j++)
                s[j] = 'x';
            s[l+1] = '\0';
        } else {
            s[0] = '!';
            s[1] = '\0';
        }

        fprintf(report, "%-20s%6c%d%c\n", s, ' ', percentage[j], '%');

        if (percentage[j] >= 0)
        {
            if (percentage[j] < min)        
            {
                min = percentage[j];        
                min_pos = j;                
            }
            if (percentage[j] > max)    
            {
                max = percentage[j];        
                max_pos = j;                
            }
        }
    }


    fprintf(report, "***lowest percentage:  %d%c (student ID: %d)\n", min, '%', student_id[min_pos]);
    fprintf(report, "***highest percentage: %d%c (student ID: %d)\n", max, '%', student_id[max_pos]);

    fclose(report);

    }
4

1 に答える 1

2

次のエラーが表示されます。

  1. s[l+1] = '\0' ではなく、s[l] = '\0' である必要があります。
  2. バーを s に書き込んだ後、出現するすべての j を i に置き換える必要があります。
  3. min_pos と max_pos が初期化されていない可能性があります。

本当の問題は 2 番です。変数を可能な限り小さいスコープに入れる習慣を身に付けることで、この種の間違いを避けることができます。つまり、あなたはこれを書いていました:

        ...
        fprintf(report, "%d%c", student_id[i], ' ');

        /* display percentage */
        {
          char s[20];

          if (percentage[i] > 0) {
            int l, j;

            l = percentage[i] / 10; // the length of the bar
            if ((percentage[i]%10) > 0)
                l++;
            for (j = 0; j < l; j++)
                s[j] = 'x';
            s[l] = '\0';
          }
          else {
            s[0] = '!';
            s[1] = '\0';
          }

          fprintf(report, "%-20s%6c%d%c\n", s, ' ', percentage[i], '%');
        }

        /* update min, max */
        if (percentage[i] >= 0) {
        ...

/* update ... */. さらに良いのは、パーセンテージ表示ビットを別の関数に入れることです。

ところで、フォーマット文字列にこれらの %c は必要ありません。文字を直接入力してください。% は %% でエスケープできます。

于 2012-08-05T17:04:22.593 に答える