3

sqlite dbをクエリしていますが、結果(TEXT属性)をC ++ std::stringに変換する必要があります。これを達成するのは難しいことではないように感じますが、私は問題を抱えています。

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
4

2 に答える 2

4

あなたの問題はsqliteとは関係ありません。で使用する場合%s、NOTprintfprintf期待します。char *std::string

たとえば、これを変更します。

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

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

何が起こるか見てみましょう。

C ++には、文字列を実装する2つの主要な方法があります。従来のC文字列(char*)とstd::stringC++標準ライブラリにあるクラス。C APIを扱う場合は、主に前者を扱います。printfsqlite*は両方ともCAPIからのものであるため、を処理することを期待してchar*ください。

于 2012-12-09T01:44:12.720 に答える
3

問題はではありませんsqlite3_column_text

printfformat指定子%sは、C文字列(charポインター)を想定しています。

printfスタックに渡される値を検査できないため、フォーマット指定子を信頼する必要があります。フォーマット指定子は%sであるため、charポインターであるため(そうではありません)、引数を読み取りますが、偶然にも、クラッシュするのではなく、間違った結果を出力します。

std::string対応する読み取り専用のC文字列を取得する関数を公開します。たとえば、2番目のケースは次のようになります。

// Get a C string from std::string
printf("Result2: %s", try1.c_str());
于 2012-12-09T01:43:39.023 に答える