你好我试着和一个学生的结构一起工作,但每次我问等级的输入程序停止运行,我不知道为什么。即时通讯使用Turbo C ++ 4.0。如果我使用等级作为int程序没有停止,但当我使用它们作为浮动程序停止运行。请任何帮助下面的代码:
box-sizing, vertical-align, padding, font-size, line-height
答案 0 :(得分:2)
您定义:
#define num 2
struct student { … } est[num];
然后你循环:
for (i = 0; i <= num; i++)
{
…scanning code…
}
这是一个缓冲区溢出。它试图读取3个学生的数据,第三个学生的数据在分配给est
的空间之后进入空间。这是缓冲区溢出并导致未定义的行为;什么都可以发生,没关系。
在C中,习惯使用惯用的for
循环:
for (i = 0; i < limit; i++)
在读取数据的代码中,您需要检查scanf()
调用是否成功:
printf("\nName of student[%d]:",i);
if (scanf("%s", est[i].name) != 1) // Note no & for strings
…handle error…
printf("\nGrade #1 [%d]:",i);
if (scanf("%f", &est[i].cal1) != 1)
…handle error…
printf("\nGrade #2 [%d]:",i);
if (scanf("%f", &est[i].cal2) != 1)
…handle error…
打印循环不应尝试打印比实际读取的条目更多的条目,如果出现错误,则可能小于num
。显然,它也需要处于惯用形式,但你真的应该使用:
int j;
for (j = 0; j < i; j++)
或类似的东西,如果只读了一个条目,你只打印那一个条目。
答案 1 :(得分:0)
这是代码的一个例子 干净地编译,链接,运行
我没有使用conio.h,因为它是非标准的 (在我的机器上不可用)
此代码仍需要对scanf添加的返回值进行错误检查
#include <stdio.h>
//#include <conio.h>
#include <stdlib.h> // system()
#define num (2)
struct student
{
char name[50];
float cal1;
float cal2;
float prom; // only one ';'
};
// separated definition, above, from declaration, below
struct student est[num];
int main ()
{
int i=0;
system( "cls" );
//clrscr();
for(i=0;i<num;i++) // note correction to for statement
{
printf("\nName of student[%d]:",i);
scanf(" %49s", est[i].name); // note correction to format string
// and using array
// as degraded into pointer
// otherwise
// unknown where trying to place data
// added vertical spacing for readability
printf("\nGrade #1 [%d]:",i);
scanf("%f", &est[i].cal1);
// added vertical spacing for readability
printf("\nGrade #2 [%d]:",i);
scanf("%f", &est[i].cal2);
}
for(i=0;i<num;i++) // note correction to 'for' statement
{
printf("\nStudent [%d]:",i);
printf("\nName: ");
printf("%s",est[i].name);
printf("\nGrade #1: ");
printf("%f",est[i].cal1);
printf("\nGrade #2: ");
printf("%f",est[i].cal2);
}
getchar(); // this will input the final newline, so will exit immediately
//getch();
return 0;
} // end function: main