我在64位linux系统上的以下程序中将row [1]转换为unsigned long时遇到了问题:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <mysql.h>
MYSQL *conn;
int main()
{
char query[6500];
int mysqlStatus = 0;
MYSQL_RES *result;
MYSQL_ROW row;
int num_rows_result = 0;
unsigned long long_ip;
int i = 0;
/* connect to db and initialize arrays with values read from db */
conn = mysql_init(NULL);
mysql_real_connect(conn, "host", "username", "passwd", "db", 0, NULL, 0);
sprintf(query," ");
sprintf(query,"SELECT * FROM rolla_sorted_in1");
mysqlStatus = mysql_query(conn, query);
if (mysqlStatus)
{
printf("there was a problem with the following mysql query:\n");
printf("\t%s\n",query);
}
result = mysql_store_result(conn);
num_rows_result = mysql_num_rows(result);
if ( num_rows_result > 0 )
{
for (i=0;i<10;i++)
{
row = mysql_fetch_row(result);
long_ip = (unsigned long) row[1];
printf("row[1]: %s, long_ip: %lu\n",row[1],long_ip);
}
}
else
{
printf("sorted_in1 is empty\n");
}
mysql_free_result(result);
printf("sizeof(ptr): %lu, sizeof(ul): %lu\n",sizeof(row[1]),sizeof(long_ip));
}
这是输出:
row[1]: 419670989, long_ip: 6420226
row[1]: 1102313293, long_ip: 6420354
row[1]: 3294303560, long_ip: 6420482
row[1]: 1408935374, long_ip: 6420610
row[1]: 3242924999, long_ip: 6420738
row[1]: 1509939008, long_ip: 6420866
row[1]: 2707912135, long_ip: 6420994
row[1]: 2556917191, long_ip: 6421122
row[1]: 3510964689, long_ip: 6421250
row[1]: 1186041166, long_ip: 6421379
sizeof(ptr): 8, sizeof(ul): 8
任何指针?感谢。
答案 0 :(得分:3)
使用long_ip = strtoul(row[1], NULL, 0)
获取无符号长值;
: - )
n列的行[0] ..行[n-1]都是类型安全字段长度确定的原始字节的POINTERS。整数和浮点数不存储在int或long的机器类型中;但是他们的字节表示......所以例如255不存储为0xFF
字节,而是存储为2
5
5
:长度为3的字符串。
你必须使用mysql_fetch_field来检索字段....是一个字节计数的字符串数组,由于它们是二进制数据,因此可能不会被NULL终止。 (see MYSQL_ROW)所以你必须确保使用mysql_fetch_lengths(结果)为每一行使用正确的字节长度,并使用像snprintf(field [k],“%。s”,(int)length [k]之类的东西,row [k]);将数据放入一个以空字符结尾的字符串,数据不是一个BLOB(对于你必须使用memcpy处理它的blob),在你的情况下,数据是一个整数(实际上存储为行的字符串{ {3}})所以你必须使用long_ip = strtoul(row 1,NULL,0);让无符号长出来。