как сохранить printf в переменную?

Для C++ проверьте IPC Повышения.
можно, вероятно, создать или найти некоторую привязку для языков сценариев также.

Иначе, если действительно важно быть в состоянии взаимодействовать через интерфейс с языками сценариев, Ваш лучший выбор состоит в том, чтобы просто использовать файлы, каналы или сокеты или даже высокоуровневую абстракцию как HTTP.

17
задан technosaurus 8 December 2017 в 17:29
поделиться

5 ответов

Вы можете сделать это с помощью 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 вставляет строку и устраняет необходимость сначала убедиться, что она правильно экранирована.

36
ответ дан 30 November 2019 в 10:24
поделиться

Вы хотите sprintf () .

char *sqlAnswers = malloc(SIZE_TO_HOLD_FINAL_STRING);
sprintf(sqlAnswers, "select key from answer WHERE key = %s LIMIT 5;", tmp);
9
ответ дан 30 November 2019 в 10:24
поделиться

Если вы используете 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);
8
ответ дан 30 November 2019 в 10:24
поделиться

В Windows вы можете использовать sprintf_s, который добавляет защиту от переполнения буфера, как говорил Майкл Э.

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

0
ответ дан 30 November 2019 в 10:24
поделиться

На самом деле я использую 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);
2
ответ дан 30 November 2019 в 10:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: