Puedes hacerlo con sprintf
, pero no solo (con seguridad). En un sistema sano, use snprintf
dos veces, una para averiguar el tamaño a usar y la segunda vez para hacerlo. Esto depende de snprintf
devolviendo la cantidad de caracteres necesarios cuando se queda sin espacio. Los sistemas compatibles con Linux, BSD y C99 hacen esto; Windows normalmente no. En este último caso, deberá asignar un búfer inicial y asignar uno más grande si snprintf
falla (en un bucle hasta que snprintf
tenga éxito). Pero el C99, el siguiente trabajo:
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);
Sin embargo, para la construcción de SQL, es mucho mejor usar prepared statements. Evitan las vulnerabilidades de inyección de SQL (y frecuentemente la necesidad de sprintf
). Con ellos, prepararía la frase "seleccionar clave de respuesta donde clave =? Límite 5;" y luego ejecutarla con el parámetro tmp
. El motor de SQL coloca la cadena y elimina la necesidad de asegurarse de que se haya escapado correctamente primero.
Una de las razones por las cuales es mejor vincular los parámetros – eckes