获取MySQL查询以保存为全局变量是C.
我在运行函数时遇到问题,并将MySQL查询的结果保存为其他函数可以使用和调用的变量。 我知道结果从表中读取为字符串。 在获得结果并将其转换为浮点数然后将结果传递给指针时,我能够做到这一点。 但我似乎无法弄清楚如何将结果作为字符串,并将其与另一个字符串进行比较,以查看它们是否匹配。 无论我试图做什么,我似乎都无法获得一个值作为字符串保存到函数外部的变量。
这是我如何让它作为一个浮点工作的代码:
(主要function之外)
float temperature_reading; float *p_temperature_reading= &temperature_reading; float humidity_reading; float *p_humidity_reading= &humidity_reading;
我使用float的函数,我可以保存到全局变量
void MIA_get_current_temperature() { const char *query = "SELECT Temperature, Humidity FROM `temperature` WHERE Type='Current_Temperature'"; if (mysql_query(conn, query) != 0) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(-1); } else { MYSQL_RES *query_results = mysql_store_result(conn); if (query_results) { // make sure there *are* results.. MYSQL_ROW row; while((row = mysql_fetch_row(query_results)) !=0) { float f = row[0] ? atof(row[0]) : 0.0f; float h = row[1] ? atof(row[1]) : 0.0f; *p_temperature_reading = f; *p_humidity_reading = h; printf("The Temp & Hum from DB is: %.1f & %.1f\n", *p_temperature_reading,*p_humidity_reading); } /* Free results when done */ mysql_free_result(query_results); } } }
这是我无法工作的function:
(主要function外)
char ac_mode[256]; char *p_ac_mode = &ac_mode[256];
function:
void MIA_get_desired_temperature() { const char *query = "SELECT Mode, Desired_Temperature, Threshold FROM `ac_mode` WHERE Status='ON'"; if (mysql_query(conn, query) != 0) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(-1); } else { MYSQL_RES *query_results = mysql_store_result(conn); if (query_results) { // make sure there *are* results.. MYSQL_ROW row; while((row = mysql_fetch_row(query_results)) !=0) { char *ac = row[0] ? row[0] : "NULL"; float desired_temperature = row[1] ? atof(row[1]) : 0.0f; int threshold = row[2] ? atof(row[2]) : 0.0f; *p_ac_mode = *ac; *p_desired_temperature = desired_temperature; *p_threshold=threshold; } /* Free results when done */ mysql_free_result(query_results); } } }
char * ac是我希望存储字符串的地方。
这一行:
char *p_ac_mode = &ac_mode[256];
..是不正确的。 你可能试图声明一个指向数组的指针(或者可能是它的内容)……你实际上在做的是声明一个指向数组ac_mode
第一个字节的char *
。 这里的[256]
并没有表明ac_mode
有256个元素,它正在索引数组以获取元素256(如果它足够大,它将是数组中第257个字符 – 但它不是,所以它在数组之外) 。 然后,您将获取该越界char
的地址并将其分配给p_ac_mode
,以便p_ac_mode
指向它。
要将p_ac_mode
指向数组内容,您只需使用char *p_ac_mode = ac_mode;
(这使得它成为指向数组中第一个char *
)。 要获得指向数组本身的指针,您可以使用char (*p_ac_mode)[256] = &ac_mode;
,这使它成为一个256元素char
数组的指针。 在任何情况下根本不需要p_ac_mode
,因为你可以直接在所有相同的地方通过ac_mode
访问数组,而裸数组名称ac_mode
通常会衰减为指向其第一个char
的指针。
有了这条线:
*p_ac_mode = *ac;
..你将字符串ac
中的第一个char
复制到ac_mode
之后的第一个char
ac_mode
(因为这就是p_ac_mode
指向的内容,如上所述)。 我怀疑你实际上是在尝试通过p_ac_mode
将整个ac
字符串的内容分配给p_ac_mode
– 但是由于一些原因这不起作用。
数组实际上是一个包含相同类型的一系列值的内存块。 虽然在许多情况下数组名称将衰减为指针(数组的第一个元素的地址),但数组本身是内存块而不是指针。 您不能只将指针(新地址)分配给数组,并且数组内容也不会以这种方式自动复制。 需要逐个元素地复制内容,或者使用复制内容的函数复制内容。
您需要做的是将查询结果中的字符串内容复制到带有strcpy()
或类似内容的ac_mode
数组中。 只是改变这一行:
*p_ac_mode = *ac;
对此:
strcpy(ac_mode, ac);
……会这样做的。
您需要在MIA_get_desired_temperature函数中使用strcpy。 此外,您不需要指针p_ac_mode。 只需直接复制到ac_mode即可。
strcpy(ac_mode, ac);