22

Cでprintfが行うのと同様のものを使用して、フォーマットされた文字列を保存したい.

char *tmp = (char *)sqlite3_column_text(selectstmt, 2);
const char *sqlAnswers = printf("select key from answer WHERE key = %s LIMIT 5;", tmp);

後者は明らかにエラーです。

4

6 に答える 6

41

でできますが sprintf、単独では (安全に) できません。正常なシステムでは、snprintf2 回使用します。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 エンジンは文字列を挿入し、最初に適切にエスケープされていることを確認する必要をなくします。

于 2009-11-17T00:13:51.673 に答える
9

あなたがしたいsprintf()

char *sqlAnswers = malloc(SIZE_TO_HOLD_FINAL_STRING);
sprintf(sqlAnswers, "select key from answer WHERE key = %s LIMIT 5;", tmp);
于 2009-11-17T00:07:57.330 に答える
8

asprintfgnu または 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);
于 2009-11-17T00:36:31.260 に答える
2

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);
于 2009-12-09T20:14:49.070 に答える
0

Windows では、Michael E が言っていたように、バッファ オーバーフロー保護を追加する sprintf_s を使用できます。

http://msdn.microsoft.com/en-us/library/ce3zzk1k(VS.80).aspx

于 2009-11-17T01:33:32.293 に答える