enfoque ligeramente diferente:
void zap(char **stmt, char *argument, size_t *stmtBufLen)
{
char *fmt="INSERT INTO test(nazwa, liczba) VALUES ('nowy wpis', '%s')";
/**
* Is our current buffer size (stmtBufLen) big enough to hold the result string?
*/
size_t newStmtLen = strlen(fmt) + strlen(argument) - 2;
if (*stmtBufLen < newStmtLen)
{
/**
* No. Extend the buffer to accomodate the new statement length.
*/
char *tmp = realloc(*stmt, newStmtLen + 1);
if (tmp)
{
*stmt = tmp;
*stmtLen = newStmtLen+1;
}
else
{
/**
* For now, just write an error message to stderr; the statement
* buffer and statement length are left unchanged.
*/
fprintf(stderr, "realloc failed; stmt was not modified\n");
return;
}
}
/**
* Write statement with argument to buffer.
*/
sprintf(*stmt, fmt, argument);
}
int main(void)
{
char *stmtBuffer = NULL;
size_t stmtBufferLen = 0;
...
zap(&stmtBuffer, "foo", &stmtBufferLen);
...
zap(&stmtBuffer, "blurga", &stmtBufferLen);
...
zap(&stmtBuffer, "AReallyLongArgumentName", &stmtBufferLen);
...
zap(&stmtBuffer, "AnEvenLongerRidiculouslyLongArgumentName", &stmtBufferLen);
...
free(stmtBuffer);
return 0;
}
Esta versión utiliza asignación dinámica de memoria para cambiar el tamaño de la memoria intermedia según sea necesario, a partir de un puntero de memoria intermedia NULL (realloc (NULL, tamaño) == malloc (tamaño)) De esta forma, no tiene que preocuparse por comenzar con un búfer que sea "lo suficientemente grande".El único inconveniente es que debes recordar desasignar el búfer cuando hayas terminado con él (normalmente no me gusta dividir los deberes de administración de memoria entre la persona que llama y la persona que llama así, si lo pensé durante más de 10 minutos, vengo con algo mejor).
Parece que estás interactuando con una base de datos. ¿Debe usar C puro? Además, la mayoría de los DB tienen API para construir de forma segura las sentencias de SQL. ¿Puedes usar esos? – kennytm
Gracias, sí, uso MySQL C API, pero debo crear una cadena para usar como consulta, porque no puedo usar variables en la consulta en sí. – Devel