Печать форматированной информации в новую строку
#include <qdb/qdb.h>char * qdb_mprintf( const char *format,... );
qdb
Данная функция является вариацией вызова sprintf(). Результирующая строка выделяется с помощью malloc(), что исключает переполнение. Кроме того, она поддерживает дополнительные параметры, полезные для создания SQL запросов.
![]() | Функция qdb_statement() также позволяет выполнять форматированный вывод, но не требует обязательного освобождения возвращенной строки. Однако, qdb_mprintf() может быть полезен при формировании многострочных запросов. |
Возвращённая строка должна быть освобождена с помощью free() в обязательном порядке после использования.
Поддерживаются все стандартные форматы printf(). Дополнительный формат "%q" во многом аналогичен "%s", но удваивает каждый символ '
(каждую одинарную кавычку). Этот формат спроектирован для использования внутри строкового литерала. Удваивая каждую конструкцию '
, он экранирует этот символ и позволяет вставить его в строку.
Допустим, имеется некоторая строка:
char *zText = "It's a happy day!";
В SQL запросе она может быть использована как:
qdb_mprintf( db, "INSERT INTO table VALUES('%q');", zText );
Результирующая строка будет иметь вид:
INSERT INTO table VALUES('It''s a happy day!');
Это корректная конструкция, поскольку при использовании "%s" получился бы SQL запрос с синтаксической ошибкой:
INSERT INTO table VALUES('It's a happy day!');
Как правило в строковых литералах всегда следует использовать "%q" вместо "%s".
Формат "%Q" аналогичен "%q", за исключением того, что она обрамляет всю строку в одинарные кавычки. Также каждый параметр, являющийся указателем на NULL
, заменяется текстом "NULL" (без одинарных кавычек):
char *zSQL = sqlite3_mprintf( "INSERT INTO table VALUES(%Q);", zText );sqlite3_exec( db, zSQL, 0, 0, 0 );sqlite3_free( zSQL );
Приведённый выше код отобразит правильный SQL запрос в переменную zSQL, даже если переменная zText есть NULL
.
ЗОСРВ «Нейтрино»
qdb_snprintf(), qdb_vmprintf(), printf()
Предыдущий раздел: перейти