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