Как я могу установить переменную заполнителя внутри строки в C - PullRequest
0 голосов
/ 25 апреля 2018

Как я могу установить переменную-заполнитель внутри строки в C?

Например, установите ID из переменной int id = 1234.

sql = "INSERT INTO REV_ENTITY (ID, NAME, AGE, ADDRESS, SALARY)" \
          "VALUES (99, 'John Doe', 25, 'Rich-Mond ', 65000.00 );";

ОБНОВЛЕНИЕ

Я хотел бы иметь заключительную строку, содержащую значение переменной.

Это, как предложено, не работает:

sql = "INSERT INTO REV_ENTITY (ID,NAME,AGE,ADDRESS,SALARY)" \  
    "VALUES (%d, 'REV', 25, 'Rich-Mond ', 65000.00 );";  

rc = sqlite3_exec(db, printf(sql, 999), callback, 0, &zErrMsg);  

Я хочу что-то подобное в Java:

String string = String.format("A string %s", aVariable);

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Помимо snprintf, упомянутого в другом ответе, вы можете использовать функцию char *sqlite3_mprintf(const char*,...) из API sqlite3. Он использует встроенную функцию sqlite printf и выделяет память для строки, используя sqlite3_malloc64(). Если все идет хорошо, он возвращает указатель на строку, в противном случае он возвращает NULL:

int id = 999;
char *sql;
sql = sqlite3_mprintf("INSERT INTO REV_ENTITY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (%d, 'REV', 25, 'Rich-Mond ', 65000.00 )", id);
if (sql != NULL) {
    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if (rc != SQLITE3_OK)
        /* Do some error handling. */
    sqlite3_free(sql);
}

В отличие от printf семейства функций, sqlite3_mprintf не может позволить себе сообщить, если формат не связан с аргументами. Так что, если случится так, что вы используете компилятор GCC, добавление следующего кода может быть полезным:

extern char *sqlite3_mprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2)));

Другим решением, рекомендованным в комментариях, является использование функций подготовки, выполнения и финализации sqlite3:

int id = 999;
sqlite3_stmt *stmt = NULL;
char *sql = "INSERT INTO REV_ENTITY (ID,NAME,AGE,ADDRESS,SALARY) " \
            " VALUES (?, 'REV', 25, 'Rich-Mond ', 65000.00 )";
sqlite3_prepare(db, sql, strlen(sql), &stmt, NULL);
/* Bind id. */
sqlite3_bind_int(stmt, 1, id);
if (sqlite3_step(stmt) == SQLITE_DONE) {
    printf("Insertion success\n");
} else {
    fprintf(stderr, "Insertion error\n");
}
/* Finalize and destroy statement. */
sqlite3_finalize(stmt);
0 голосов
/ 25 апреля 2018

используйте snprintf, псевдокод выглядит так:

int idValue = 1234;
snprintf(buffer, bufferLength, "insert bla bla VALUES (%d, 'John Doe', 25, 'Rich-Mond ', 65000.00 )", idValue);
sqli_execute(buffer);

в вашем случае это будет выглядеть так:

//initialize sql variable before sprintfing into it
snprintf(sql, maximumSqlBufferLength "INSERT INTO REV_ENTITY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (%d, 'John Doe', 25, 'Rich-Mond ', 65000.00 );", id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...