C 当函数返回空时,程序崩溃

C 当函数返回空时,程序崩溃,c,function,crash,return,C,Function,Crash,Return,我想检查我的预定义数据是否在我拥有的.dat文件中。如果是这样,我会打印出来。如果没有,我的程序将崩溃,因为我编写的函数没有返回任何内容 我该如何解决这个问题?我如何检查是否有不匹配,并说不匹配,以防止我的程序崩溃 struct objectList用于我的预定义数据。struct数据库用于.dat文件中的数据 struct objectList { double oArea; double oLength; double oFormFactor; }; struct

我想检查我的预定义数据是否在我拥有的.dat文件中。如果是这样,我会打印出来。如果没有,我的程序将崩溃,因为我编写的函数没有返回任何内容

我该如何解决这个问题?我如何检查是否有不匹配,并说不匹配,以防止我的程序崩溃

struct objectList用于我的预定义数据。struct数据库用于.dat文件中的数据

struct objectList
{
    double oArea;
    double oLength;
    double oFormFactor;
};

struct database
{
    char name[15];
    double dArea;
    double dLength;
    double dFormFactor;
};
如果只有面积、长度和formFactor匹配,此函数将读取文件并返回值

struct database myReadFile(FILE *rPtr, double area, double length, double formFactor)
{
    struct database fromDb = { "", 0.0, 0.0, 0.0 };

    if ((rPtr = fopen("objects.dat", "r")) == NULL)
        printf("Couldn't open the file to read.\n");
    else
    {
        fscanf(rPtr, "%s%lf%lf%lf", fromDb.name, &fromDb.dArea, &fromDb.dLength, &fromDb.dFormFactor);

        while (!feof(rPtr))
        {
            if (fromDb.dArea == area)
                if (fromDb.dLength == length)
                    if (fromDb.dFormFactor == formFactor)
                    {
                        printf("We have found the %s\n", fromDb.name);
                        return fromDb;
                    }

            fscanf(rPtr, "%s%lf%lf%lf", fromDb.name, &fromDb.dArea, &fromDb.dLength, &fromDb.dFormFactor);
        }
    }
    fclose(rPtr);
}
此函数用于打印值

void getValues(FILE *gPtr, double area, double length, double formFactor)
{
    struct database objectValues = { "", 0.0, 0.0, 0.0 };

    objectValues = myReadFile(gPtr, area, length, formFactor);

    printf("Object name: %s\n", objectValues.name);
    printf("Object area: %.2lf\n", objectValues.dArea);
    printf("Object length: %.2lf\n", objectValues.dLength);
    printf("Object formFactor: %.2lf\n", objectValues.dFormFactor);
}
主要内容:


我的.dat文件有玩具、硬币、mp3,但不是随机的东西。因此,当i=3时,我的程序崩溃。

我看到的代码的主要问题是读取循环,它主要有两个问题

阅读:

必须检查scanf的返回值,并防止scanf溢出目标缓冲区,因此循环条件应为

while (fscanf(rPtr, "%14s%lf%lf%lf", fromDb.name, &fromDb.dArea, 
           &fromDb.dLength, &fromDb.dFormFactor) == 4)
这个怎么样

int
myReadFile(struct database *db, double area, double length, double formFactor)
{
    FILE *rPtr;
    if ((rPtr = fopen("objects.dat", "r")) == NULL)
        printf("Couldn't open the file to read.\n");
    else
    {
        while (fscanf(rPtr, "%14s%lf%lf%lf", db->name, &db->dArea, 
            &db->dLength, &db->dFormFactor) == 4)
        {
            if ((db->dArea != area) || (db->dLength != length) || 
                (db->dFormFactor != formFactor))
            {
                continue;
            }
            fclose(rPtr);
            return 0;
        }
    }
    fclose(rPtr);
    return -1;
}
在主要功能中

struct database result;
if (getValues(&result, myObjectList[i].oArea, 
    myObjectList[i].oLength, myObjectList[i].oFormFactor) == 0)
{
    fprintf(stderr, "%s\n", result.name);
}

@Massakrienn并非myReadFile的所有路径都返回值。启用编译器警告并使其出错!如果您没有收到投诉,请使用更好的编译器。因为您已经知道您没有返回有效值,为什么要在这里询问?谢谢。非常顺利,我想要的。我是否应该在函数返回0时关闭该文件?是的,您应该!!!我错过了,为了完整性,我将把它添加到答案中。哦,您也不需要将rPtr传递给函数,也许可以传递文件的路径,这将使函数更易于重用
struct database result;
if (getValues(&result, myObjectList[i].oArea, 
    myObjectList[i].oLength, myObjectList[i].oFormFactor) == 0)
{
    fprintf(stderr, "%s\n", result.name);
}