将数据存储在数组中并循环遍历,1个元素为空

时间:2013-06-20 11:00:25

标签: c structure

我是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;

load数组函数具有以下代码:

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

2 个答案:

答案 0 :(得分:1)

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

numberLookupStruct* numberLookup;

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

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

更改为

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

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

答案 1 :(得分:0)

进行如下更改

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

我怀疑strdup()是因为存储空间不足导致电话号码失败。