Cでprintfが行うのと同様のものを使用して、フォーマットされた文字列を保存したい.
char *tmp = (char *)sqlite3_column_text(selectstmt, 2);
const char *sqlAnswers = printf("select key from answer WHERE key = %s LIMIT 5;", tmp);
後者は明らかにエラーです。
Cでprintfが行うのと同様のものを使用して、フォーマットされた文字列を保存したい.
char *tmp = (char *)sqlite3_column_text(selectstmt, 2);
const char *sqlAnswers = printf("select key from answer WHERE key = %s LIMIT 5;", tmp);
後者は明らかにエラーです。
でできますが sprintf
、単独では (安全に) できません。正常なシステムでは、snprintf
2 回使用します。1 回目は使用するサイズを調べ、2 回目は実際に使用します。snprintf
これは、部屋がなくなったときに必要な文字数を返すことに依存します。Linux、BSD、および C99 互換システムはこれを行います。通常、Windows にはありません。後者の場合、初期バッファーを割り当て、失敗した場合はより大きなバッファーを割り当てる必要があります (成功するsnprintf
までループします)。snprintf
ただし、C99 では、次のように動作します。
char *buf;
size_t sz;
sz = snprintf(NULL, 0, "select key from answer WHERE key = %s LIMIT 5;", tmp);
buf = (char *)malloc(sz + 1); /* make sure you check for != NULL in real code */
snprintf(buf, sz+1, "select key from answer WHERE key = %s LIMIT 5;", tmp);
ただし、SQL を構築するには、準備済みステートメントを使用する方がはるかに優れています。これらは、SQL インジェクションの脆弱性を回避します (また、多くの場合は の必要性も回避しますsprintf
)。それらを使用して、「select key from answer where key = ? limit 5;」というステートメントを準備し、パラメーターを使用して実行しますtmp
。SQL エンジンは文字列を挿入し、最初に適切にエスケープされていることを確認する必要をなくします。
あなたがしたいsprintf()
。
char *sqlAnswers = malloc(SIZE_TO_HOLD_FINAL_STRING);
sprintf(sqlAnswers, "select key from answer WHERE key = %s LIMIT 5;", tmp);
asprintf
gnu または BSD libc を使用している場合は、正しいサイズのバッファーを自動的に割り当てるを使用できる場合があります。
#define _GNU_SOURCE
#include <stdio.h>
// ...
char *sqlAnswers = NULL;
int length = asprintf(&sqlAnswers,"select key from answer WHERE key = %s LIMIT 5;", tmp);
free(sqlAnswers);
sprintf で生成する代わりに、実際に sqlite3_bind_text を使用してワイルドカードを入力しています。
const char *sql1 = "select id, repA, key from iphone_reponse WHERE question_id = ?;";
sqlite3_stmt *selectstmt1;
if(sqlite3_prepare_v2(database, sql1, -1, &selectstmt1, NULL) == SQLITE_OK) {
sqlite3_bind_text(selectstmt1, 1, [questionObj.key UTF8String], -1, SQLITE_TRANSIENT);
Windows では、Michael E が言っていたように、バッファ オーバーフロー保護を追加する sprintf_s を使用できます。
http://msdn.microsoft.com/en-us/library/ce3zzk1k(VS.80).aspx