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