0

我正在使用 PostgreSql C 库libpq,我可以PGresult使用函数从指针中获取值PQgetvalue

printf现在,我有一个包含 10-20 列的表,我想通过一个简单的调用将它们打印出来:

printf("%s,%s,%s..(so on...)...%s", resA, resB, resC,..., resN);

使用函数加载resAresB字符串在哪里。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字段的值),即使我已经使用memsetcall 删除了前一个字符串(只是为了确定)。

我哪里错了?是在我的代码中,还是 gcc 假设我所有的 getField 调用都返回指向同一内存的指针,所以它实际上并没有多次调用它。

或者,printf函数是否首先评估所有参数(以相反的顺序),然​​后实际调用该函数?如果是这种情况(我敢打赌),是否有更简单的模式来实现我正在尝试的目标?

4

2 回答 2

1

您只是在此函数中返回静态/全局变量的地址,因此每次调用它时,数据都会被覆盖并返回相同的指针。

一种更简单的方法是遍历数据集并分别打印每个变量而不是格式化字符串。

于 2013-04-02T18:39:03.423 回答
1

或者, printf 函数是否首先评估所有参数(以相反的顺序),然​​后实际调用该函数?

是的。

但是没有必要复制结果,因为它们会一直保存在内存中,直到PQclear(PGresult*)被调用。

从您的函数开始,您可以获得指向fieldNamefor值的指针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);
}
于 2013-04-02T20:36:05.320 回答