2012-12-09 3 views
1

Im는 sqlite db를 쿼리하지만 결과 (TEXT 특성)는 C++ std :: string으로 변환해야합니다. 성취하기가 어렵지는 않지만 어려움을 겪고있는 것처럼 느껴집니다.C++에서 std :: string으로 sqlite 결과 변환

sqlite3_open("sqlite.db", &db); 
std::string str = "SELECT something FROM table"; 
sqlite3_prepare_v2(db, 
str.c_str(), 
-1, 
&m_statement, 
0); 

sqlite3_step(m_statement); 
// OBS: 3rd party printf, cannot use std::cout in this environment 
printf("Result1: %s",sqlite3_column_text(m_statement,0)); // OK! Result is printed 

string try1 = string(
    reinterpret_cast<const char*>(sqlite3_column_text(m_statement,0))); 
printf("Result2: %s",try1); // null 

stringstream ss; 
ss << sqlite3_column_text(m_statement,0); 
printf("Result3: %s",ss.str()); // null 

답변

3

귀하의 문제는 SQLite는 관련이 없습니다. %sprintf과 함께 사용하면 printfchar *이 아니며 std::string이 될 것으로 예상합니다.

printf("Result2: %s",try1); // null 

printf("Result2: %s",try1.c_str()); 

에 어떻게되는지 :

예를 들어이 값을 변경.

C++에는 문자열을 구현하는 두 가지 기본 방법이 있습니다. 레거시 C 문자열 (char*) 및 std::string 클래스는 C++ 표준 라이브러리에 있습니다. C API를 다루는 경우, 대부분은 C API를 다루게됩니다. printfsqlite*은 둘 다 C API에서 가져온 것이므로 char*을 처리 할 것을 기대합니다.

3

sqlite3_column_text과 관련된 문제는 아닙니다.

printf 형식 지정자 %s은 C 문자열 (char 포인터)을 필요로합니다.

printf은 스택에서 전달되는 값을 검사 할 수 없으므로 형식 지정자를 신뢰해야합니다. 형식 지정자는 %s이므로 char 포인터 였기 때문에 인수를 읽지 만 우연히 충돌하지 않고 잘못된 결과를 인쇄합니다.

std::string

는 두 번째 경우는 것, 예를 들어, 당신에게 읽기 전용 해당하는 C의 문자열을 가져옵니다 기능을 노출, 그래서 :

// Get a C string from std::string 
printf("Result2: %s", try1.c_str()); 
관련 문제