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