我不明白这个错误告诉我的是什么。当我运行程序时,它应该连续循环,直到用户输入N(不再为/退出)。我不明白发生了什么。在第一组输入之后,在提示用户“您想要处理新学生”之前,该程序会抛出该异常。
我使用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);
}
答案 0 :(得分:2)
我可以看到以下错误:
真正的问题是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 ... * /之后错误地使用了j而不是i,编译器会给你一个错误。更好的方法是将百分比显示位置于一个单独的函数中。
顺便说一下,格式字符串中不需要这些%c,只需直接输入字符即可。 %可以使用%%进行转义。