0

我是 C 新手,正在从事 C 项目。我在文件顶部定义了一个结构,因此文件中的所有内容都可以使用它。我的结构定义如下:

typedef struct NumberLookupStruct
{
    char * phoneNumber;
    char * displayName;
} numberLookupStruct;

struct numberLookupStruct *numberLookup = NULL;

在函数的开头附近,我 malloc 结构,然后调用传递结构的函数以使用数据加载结构,如下所示:

numberLookup = malloc(totalLookupNumberCount * sizeof(numberLookup));
    if (numberLookup == NULL) return 1;

    int result = loadArray(HandleDB, resultReport, rowReport, &numberLookup);
    if (result) return 1;

加载数组函数有以下代码:

int loadArray(MYSQL *HandleDB, MYSQL_RES *resultReport, MYSQL_ROW rowReport, numberLookupStruct *numberLookup)
{
    int sqlLen = 0;
    char *sql;

    sqlLen = asprintf(&sql, "SELECT * FROM TblLookups");

    SL_DebugAll(DBG_INFO, sql);
    if ((mysql_real_query(HandleDB, sql, sqlLen)))
    {
        printf("MySQL Error: %s\n", mysql_error(HandleDB));
        free(sql);
        return 1;
    }

    resultReport = mysql_use_result(HandleDB);

    int i = 0;
    printf("***LOADING ARRAY***\n\n");
    while ((rowReport = mysql_fetch_row(resultReport)))
    {
        numberLookup[i].phoneNumber = strdup((rowReport[0] != NULL && rowReport[0][0] != '\0')  ? rowReport[0] : "");
        numberLookup[i].displayName = strdup((rowReport[1] != NULL && rowReport[1][0] != '\0')  ? rowReport[1] : "");

        printf("Stored phone number%s  in %i: with Display Name: %s\n",
                numberLookup[i].phoneNumber, i, numberLookup[i].displayName);
        i++;
    }
    printf("***FINISHED LOADING ARRAY***\n\n");
    mysql_free_result(resultReport);
    free(sql);
    return 0;
}

在这一点上,这一切似乎都运行良好。当我打印出刚刚存储在结构中的内容时,电话号码和显示名称都会打印到控制台。

稍后在加载数组后的函数中,我然后调用执行搜索。此函数传递结构中的结构、电话号码、总行数,并应循环查找号码并返回显示名称。

但是,由于某种原因,当我遍历结构时,电话号码是空白的,但有一个显示名称。

下面是代码。

char * performSearch(char * phoneNumber, int totalLookupNumberCount, numberLookupStruct *numberLookup)
{
    //printf("***Performing search for phone number: %s***\n", phoneNumber);
    int i;
    for (i = 0; i < totalLookupNumberCount; i++)
    {
        printf("*PHONE NUMBER: %s***\n", numberLookup[i].phoneNumber);
        //printf("Phone Number: %s\tDisplay Name: %s\n", numberLookup[i].phoneNumber, numberLookup[i].displayName);
        //if (strcmp(numberLookupStruct[i].phoneNumber, phoneNumber) == 0)
        if (strstr(phoneNumber, numberLookup[i].phoneNumber))
        {
            printf("***FOUND MATCH: Phone Number: %s, struct phone number: %s, display name: %s***\n",
                    phoneNumber, numberLookup[i].phoneNumber, numberLookup[i].displayName);
            return numberLookup[i].displayName;
        }
    }
    return phoneNumber;
}

我不明白为什么我可以成功打印加载数组函数中存储在结构中的内容,但是在执行搜索时,11numberLookup[i].phoneNumber11 始终为空白,但numberLookup[i].displayName包含数据。

更新

LoadArray 的声明原型如下:

int loadArray(MYSQL *HandleDB, MYSQL_RES *resultReport, MYSQL_ROW rowReport, numberLookupStruct *numberLookup);
4

2 回答 2

1

您声明numberLookup为一个指针struct numberLookupStruct,由于 C 区分大小写,它是一个不完整的类型。将该声明更改为:

numberLookupStruct* numberLookup;

您正在传递 **loadArray而不是指针:

int result = loadArray(HandleDB, resultReport, rowReport, &numberLookup);

改成

int result = loadArray(HandleDB, resultReport, rowReport, numberLookup);

并弄清楚如何打开编译器的警告,以便它会在您执行此操作时告诉您。

于 2013-06-20T12:22:10.583 回答
0

进行如下更改

numberLookup = malloc(totalLookupNumberCount * sizeof(numberLookupStruct));

我怀疑 strdup() 以防电话号码因存储空间不足而失败。

于 2013-06-20T11:17:58.977 回答