我正在使用PostgreSql C库libpq
,我可以使用PGresult
函数从PQgetvalue
指针获取值。
现在,我有一个包含10-20列的表格,我想通过简单的printf
调用打印出来:
printf("%s,%s,%s..(so on...)...%s", resA, resB, resC,..., resN);
其中resA
到resB
是使用PGgetvalue
函数加载的字符串。现在,这种方法需要声明10-20个指针(如果我想用一个printf打印出来),我将使用简单的东西:
char* getFieldVal(PGresult* res, int row, char* fieldName)
{
static char tmp[1000];
memset(tmp, 0, sizeof(tmp));
// Load data here...
return tmp;
}
然后拨打printf
,如:
printf("%s,%s,%s..(so on...)...%s",
getField(r, 0, "A"), getField(r, 0, "B"), ... , getField(r, 0, "N"));
然而,printf
函数的输出表明所有getField
调用都返回从数据库请求的任何内容(在本例中为A
字段的值),甚至虽然我已经通过memset
调用删除了之前的字符串(只是为了确定)。
我哪里错了?是我的代码中的东西,或者是gcc假设我的所有getField调用都返回指向同一内存的指针,因此它实际上并没有多次调用它。
或者,printf
函数首先评估所有参数(按相反顺序),然后实际调用函数?如果是这种情况(我敢打赌),有没有更简单的模式来实现我的目标?
答案 0 :(得分:1)
您只是在此函数中返回静态/全局变量的地址,因此每次调用它时,数据都会被覆盖并返回相同的指针。
一种更简单的方法是循环数据集并分别打印每个变量而不是格式化的字符串。
答案 1 :(得分:1)
或者,printf函数首先评估所有参数(反之亦然) 顺序),然后实际调用函数?
是
但是没有必要复制结果,因为它们会在调用PQclear(PGresult*)
之前保留在内存中。
从您的函数开始,您可以使用以下代码获取指向fieldName
row
的值的指针:
char* getFieldVal(PGresult* res, int row, char* fieldName)
{
int n = PQfnumber(res, fieldName);
if (n == -1)
return NULL; /* missing field, you might prefer to return an empty string here */
else
return PQgetvalue(res, row, n);
}