Для C++ проверьте IPC Повышения.
можно, вероятно, создать или найти некоторую привязку для языков сценариев также.
Иначе, если действительно важно быть в состоянии взаимодействовать через интерфейс с языками сценариев, Ваш лучший выбор состоит в том, чтобы просто использовать файлы, каналы или сокеты или даже высокоуровневую абстракцию как HTTP.
Вы можете сделать это с помощью sprintf
, но не в одиночку (безопасно). В нормальной системе дважды используйте snprintf
: один раз, чтобы узнать размер, который нужно использовать, и второй раз, чтобы это сделать. Это зависит от 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
). С ними, вы должны подготовить оператор «выберите ключ из ответа, где ключ =? 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);
Если вы используете GNU или BSD libc, вы можете использовать asprintf
, который автоматически выделяет буфер правильного размера.
#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);
В Windows вы можете использовать sprintf_s, который добавляет защиту от переполнения буфера, как говорил Майкл Э.
http://msdn.microsoft.com/en-us/library/ce3zzk1k (VS. 80) .aspx
На самом деле я использую sqlite3_bind_text для ввода подстановочного знака вместо генерации с помощью sprintf:
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);