带有float的struct C scanf数组

时间:2015-04-26 21:57:18

标签: c struct

你好我试着和一个学生的结构一起工作,但每次我问等级的输入程序停止运行,我不知道为什么。即时通讯使用Turbo C ++ 4.0。如果我使用等级作为int程序没有停止,但当我使用它们作为浮动程序停止运行。请任何帮助下面的代码:

box-sizing, vertical-align, padding, font-size, line-height

2 个答案:

答案 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