0

PostgreSql C ライブラリを使用しており、関数を使用してポインタlibpqから値を取得できます。PGresultPQgetvalue

printf現在、10 ~ 20 列のテーブルがあり、簡単な呼び出しでそれらを印刷したいと考えています。

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

関数を使用してロードされた文字列はどこresAにありますか。さて、このアプローチでは 10 ~ 20 個のポインターを宣言する必要があり (単一の printf で出力したい場合)、次のような単純なものを使用するつもりでした。resBPGgetvalue

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呼び出しがデータベースから最初に要求されたもの (この場合はフィールドの値) を返していることを示しています。Amemset

どこが間違っていますか?私のコードの何か、またはすべての getField 呼び出しが同じメモリへのポインターを返すと仮定した gcc であるため、実際には複数回呼び出していません。

または、printf関数は最初にすべてのパラメーターを (逆の順序で) 評価してから、実際に関数を呼び出していますか? これが事実である場合(そして私はそうであるに違いない)、私が試みていることを達成するためのより簡単なパターンはありますか?

4

2 に答える 2

1

または、printf 関数は最初にすべてのパラメーターを (逆の順序で) 評価してから、実際に関数を呼び出していますか?

はい。

PQclear(PGresult*)ただし、結果は が呼び出されるまでメモリに保持されるため、結果をコピーする必要はありません。

fieldName関数から始めて、 forの値へのポインターを取得できます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 に答える
1

この関数で静的/グローバル変数のアドレスを返すだけなので、呼び出すたびにデータが上書きされ、同じポインターが返されます。

これを行う簡単な方法の 1 つは、データ セットをループして、書式設定された文字列ではなく、各変数を個別に出力することです。

于 2013-04-02T18:39:03.423 に答える