2015-04-17 156 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

相關問題