稍微不同的方法:
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;
}
此版本使用动态存储器分配根据需要来调整缓冲器,具有NULL缓冲器指针开始(realloc的(NULL,大小)==的malloc(大小) )。这样你就不必担心从一个“足够大”的缓冲区开始。唯一的缺点是你需要记住当你完成缓冲区时释放缓冲区(我通常不喜欢这样分配调用者和被调用者之间的内存管理职责;如果我考虑了超过10分钟,拿出更好的东西)。
看来你正在与数据库交互。你必须使用纯粹的C?另外,大多数DB都有API来安全地构建SQL语句。你可以使用这些吗? – kennytm
谢谢,是的 - 我使用MySQL C API,但我必须创建一个字符串用作查询,因为我不能在查询本身中使用变量。 – Devel