重新定義結構體:
typedef struct student {
float c;
float java;
} STU;
然後在for循環內僅使用:
scanf("%f",&stu[i].c); // 或者&(stu[i].c)
scanf("%f",&stu[i].java); // 或者&(stu[i].java)
問題依舊。
但如果此時已經定義了float fTmp;並在循環體內這樣寫:
scanf("%f",&fTmp);
stu[i].c = fTmp;
scanf("%f",&fTmp);
stu[i].java = fTmp;
則問題得到解決。
幾經修改,最後改成最原先的代碼,問題也不存在了,無語……
原因分析:
可能是C運行庫的問題,代碼方面理論上沒有任何問題的。
另外,對於應該輸入float的時候用戶輸入char導致跳過某些變量輸入的情況,這和scanf內部實現的機制有關,因為它是靠類型指針來獲取對應值的,那麽如果對於普通類型(比如float,VC6中為4字節)變量,如果用戶的錄入有問題(比如char*),scanf會直接跳過當前變量的賦值。針對這種情況,如果非要用C語言而不是C++的話,那麽目前還沒有好的防止錯誤或者在輸入錯誤時給出提示的方法。
以下是模擬錯誤的執行過程:
姓名:張三
C分數:12
JAVA分數:12
姓名:王
C分數:99
JAVA分數:66
姓名:劉
C分數:34
JAVA分數:56
姓名:陳
C分數:aa
JAVA分數:姓名:cc
C分數:bb
JAVA分數:
<01> [0x0013FEE4] 12.00 [0x0013FEE8] 12.00 "張三"
<02> [0x0013FF04] 99.00 [0x0013FF08] 66.00 "王"
<03> [0x0013FF24] 34.00 [0x0013FF28] 56.00 "劉"
<04> [0x0013FF44] -107374176.00 [0x0013FF48] -107374176.00 "陳"
<05> [0x0013FF64] -107374176.00 [0x0013FF68] -107374176.00 "cc"
Press any key to continue
用於模擬該錯誤的代碼如下:
#include "stdio.h"
#define n 5
struct student
{
int num;
float c;
float java;
char name[20];
};
void main()
{
struct student stu[n];
int i;
for(i=0;i<n;++i)
{
stu[i].num=i+1;
printf("姓名:");
fflush(stdin);
gets(stu[i].name);
printf(" C分數:");
scanf("%f",&stu[i].c);
// printf("[0x%08X] size:%3d\n",&(stu[i].c),sizeof(stu[i].c));
printf(" JAVA分數:");
scanf("%f",&(stu[i].java));
}
printf("\n\n");
for(i=0;i<n;++i)
{
printf("<%02d> [0x%08X] %.2f [0x%08X] %.2f \"%s\"\n",stu[i].num, &(stu[i].c),stu[i].c,&(stu[i].java),stu[i].java,stu[i].name);
}
}