使用静态字符数组创建辅助函数

时间:2013-04-02 18:33:38

标签: c postgresql libpq

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

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

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字段的值),甚至虽然我已经通过memset调用删除了之前的字符串(只是为了确定)。

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

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

2 个答案:

答案 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);
}