2015-04-17 101 views
0

第一篇文章很适合我。我试图实现一部分mysql C API来检索一个已知字段,它将是一个TINYINT值(布尔值,1或0)如何访问指向数组的指针中的第一个元素

mysql C API提供了一个类型,它是一个指向数组MYSQL_ROW行的指针;其中数组的元素通过行[i]进行访问,其中i是索引。无论数据库中的数据类型如何,元素都以字符串形式返回。

我试图访问的字段显然是布尔值,如果查询找到该字段,它将为1或0。我想对这个字段的值进行逻辑检查,但是我正在努力处理类型。我试图将行[我]投到一个int,但没有好,我似乎得到指针返回。我知道C没有本地布尔类型,但可以实现。任何想法也将受到欢迎。这里是我的代码,提前很多感谢保罗 -

void process_result_set (MYSQL *conn, MYSQL_RES *res_set) { 

MYSQL_ROW row; 
unsigned int i; 
unsigned int logonstatus; 

while ((row = mysql_fetch_row (res_set)) != NULL) 
{ 
for (i = 0; i < mysql_num_fields (res_set); i++) 
{ 

    logonstatus = (int)(row[i]); // gives an int return but appears to  return a memory location i.e. a pointer 
    printf("The value of logon status is: %d\n", logonstatus); 
    printf("\nThe value of the logon field is:%s\n", row[i]); 

} 

} 
if (mysql_errno (conn) != 0) 
    print_error (conn, "mysql_fetch_row() failed"); 
else 
printf ("%lu rows returned\n",(unsigned long) mysql_num_rows (res_set)); 
} 

在回答你的问题,是的是它的指针,这对于该特定领域只有一个元素将永远存在的数组并将被设置为1或0,或者该字段最初不会从我正在运行的查询中出现。

2 printf语句做同样的事情,一个传递一个int,另一个是字符串,这是使用mysql api时数据从数据库返回的方式。

很多感谢您的帮助。

即我正的输出如下所示:

(~/museuminfo) localhost $ ./museumDB 

Connecting to MySQL Server... 

Connection Successful 

The SELECT statement you have built is: SELECT logon_status FROM users  WHERE userpin='2468' 
The value of logon status is: 146753048 

The value of the logon field is:1 
1 rows returned 

回答

0

秘密在这里:logonstatus = (int)(row[i]);。你说MySQL无论列的数据类型如何都会返回字符串,这意味着row [i]是一个C字符串,它转换为char*。这就是为什么你看到一个指针,并且投射到int不会对你有帮助,因为变量仍然保持相同的值(但现在它不是pointer)。 C类型转换不会转换该值,只能转换为类型表示。

您需要将字符串转换为int,那么您可以使用的C函数是atoi()。你需要像这样更新你的代码:logonstatus = atoi(row[i]);

+0

工作..辉煌......感谢您的帮助:) – TitaniumBoy

+0

很高兴我能帮上忙。顺便说一句,'atoi'函数带有'atof'这样的亲戚,所以如果你需要转换其他数据类型的其他字段,你可以使用它们。如果它对你有帮助,你也可以接受我的答案吗?谢谢, – Cristik

0

的字符串,在C,是一个指针,指向字符数组。该类型是char *。所以,你想要引用row [i](这是一个指向char的指针,在这种情况下等于数字1的char,正如你已经注意到的那样)。使用此:中

logonstatus = (int)*row[i]; 

代替

logonstatus = (int)row[i]; 

row前星说,观察到由值称为row[i]指针指向。希望这是有道理的。

+0

这将给他的字符串的第一个字符,而不是它的int值。 – Cristik

+0

是的。我想我认为与打印为'1'的char相对应的int值是int 1.如果int大于一位数,atoi是要走的路,但在这种情况下,它可能是0或1,所以这应该没问题。虽然可能char 1不是int 1。我本可以发誓。这是一种特殊情况,几乎没有区别,但是解析指针比调用atoi更快。 – dmedine

相关问题