当函数返回空时程序崩溃

Posted

技术标签:

【中文标题】当函数返回空时程序崩溃【英文标题】:Program crashes when a function returns empty 【发布时间】:2016-01-09 04:33:33 【问题描述】:

我想检查我的预定义数据是否在我拥有的 .dat 文件中。如果是这样,我打印它们。如果没有,我的程序就会崩溃,因为我写的函数没有返回值。

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

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

struct objectList

    double oArea;
    double oLength;
    double oFormFactor;
;

struct database

    char name[15];
    double dArea;
    double dLength;
    double dFormFactor;
;

如果只有“面积”、“长度”和“形状因子”匹配,此函数会读取文件并返回值。

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);

主要:

int main()

    struct objectList myObjectList[4];
    myObjectList[0] =  9214.00, 417.24, 22.08 ;       // Coin
    myObjectList[1] =  54375.00, 1087.94, 49.97 ;     // mp3
    myObjectList[2] =  12785.00, 550.70, 23.22 ;      // toy
    myObjectList[3] =  100.01, 200.02, 300.03 ;       // Random stuff

    FILE *cfPtr;

    if ((cfPtr = fopen("objects.dat", "a +")) == NULL)
        printf("Couldn't open the file\n");
    else
        fclose(cfPtr);

    int i = 2;
    getValues(cfPtr, myObjectList[i].oArea, myObjectList[i].oLength, myObjectList[i].oFormFactor);
    return 0;

我的 .dat 文件包含“toy”、“coin”、“mp3”,但没有“random stuff”。所以当 i = 3 时,我的程序崩溃了。

【问题讨论】:

@massakrienen 并非myReadFile 的所有路径都返回值。 启用编译器警告并使其出错!如果您没有收到投诉,请使用更好的编译器。 既然你已经知道你没有返回一个有效的值,你为什么要在这里问? 【参考方案1】:

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

    阅读:Why is while (!feof(rPtr)) always wrong。

    你必须检查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);

【讨论】:

谢谢。非常顺利,是我想要的。当函数返回 0 时我是否也应该关闭文件? 是的,你应该!!!我错过了,为了完整起见,我会将其添加到答案中。哦,你也不需要将rPtr 传递给函数,也许将路径传递给文件,这将使函数更可重用

以上是关于当函数返回空时程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

iOS 14.3 中数组为空时崩溃

在android中触摸EditText时应用程序崩溃

为啥当我按下返回按钮时我的程序崩溃

应用程序在单击带有空编辑文本的按钮时崩溃

OpenCV程序在退出时崩溃linux(使用cvtColor)

QItemSelectionModel::selectedIndexes() 崩溃