C基础知识,const unsigned char *为整数或bool

时间:2012-03-21 07:08:47

标签: c++

我试图通过这种方式从数据库结果中获取整数或bool:

bool tblexist = false;
int t_exists = 0;    

tblexist = (bool)sqlite3_column_text(chkStmt, 1);
t_exists = atoi(sqlite3_column_text(chkStmt, 1));

......但没有人工作。
sqlite3_column_text(chkStmt,1)的预期值始终为0或1。 但我收到错误消息:

  

从'const unsigned char *'到'const char *'的无效转换     初始化'int atoi(con​​st char *)'的参数1     || ===构建完成:2个错误,0个警告=== |

如何解决这个问题并以优雅的方式获得整数或bool?

3 个答案:

答案 0 :(得分:2)

尝试转换为bool的第一行将始终返回true,因为如果字符串指针不为NULL,则它将始终为“true”。如果你想使用它,有几种方法可以解决这个问题:

// 1. Dereference pointer to get first character in string
tblexist = (*sqlite3_column_text(chkStmt, 1) != '0');

// 2. Using string comparison
tblexist = (strcmp(sqlite3_column_text(chkStmt, 1), "0") != 0);

对于第二个,请尝试这样做:

t_exists = atoi((const char *) sqlite3_column_text(chkStmt, 1));

这是因为sqlite3_column_text返回了const unsigned char *类型,但atoi想要const char *

答案 1 :(得分:0)

atoi或类似的转换使用起来会很昂贵。

const unsigned char _TRUE = '1';
const unsigned char* dbDATA = sqlite3_column_text(chkStmt, 1);
bool exists = (_TRUE == dbDATA[0]); //i assume you are expecting "0" or "1" from DB

答案 2 :(得分:0)

首先,列的索引从零开始,因此除非查询请求两个(或更多)列,sqlite3_column_text(..., 1)将返回第二列。

其次,该函数返回一个指向字符串的指针,因此您必须从指针取消引用该值,并将该字符串转换为:

const char *data = sqlite3_column_text(chkStmt, 0);
int val = atoi (data);   // for ascii representation of a number