c - 当功能返回空时,程序崩溃

标签 c function crash return

我想检查我的预定义数据是否在我拥有的 .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;
};

如果只有“area”、“length”和“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);
}

主要:

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 文件包含“玩具”、“硬币”、“mp3”,但没有“随机内容”。所以当 i = 3 时,我的程序崩溃了。

最佳答案

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

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

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

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

关于c - 当功能返回空时,程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33068550/

相关文章:

c - 与数组匹配结果段错误

apache - 是什么导致 apache 崩溃并出现错误 "Inconsistency detected by ld.so"?

objective-c - (null) 与 <null> 有什么区别?

rust - 如何检查 Flatbuffer 是否有效或正确处理错误?

c - 奇怪的行为c自愿溢出

c - R的R_pow()和libc的pow()有什么区别?

c - 如何在char中保存二进制null

javascript - 当返回嵌套在 then block 中的 Promise 时,使用 Promise.all 的 map 会返回未定义的数组

python - 在 Python 中调用多个函数的优雅方式

mysql - SQL - 创建一个返回表行的函数