PostgreSQL PqGetValue char to integer в c программировании - PullRequest
0 голосов
/ 20 февраля 2020

У меня небольшая проблема с PostgreSQL результатами и целым числом на C языке. Итак, у меня есть простая таблица с такой структурой:

ID (pk int) | имя (текст) | значения (int)

1 | яблоко | 100

2 | банан | 9

Я использую этот код:

PGconn *conn = PQconnectdb("user=un password=pw dbname=db hostaddr=1.2.3.4 port=5432");
res = PQexec(conn, "SELECT * FROM fruits WHERE name='banana'");
int *banan_count;
banana_count = (int)PQgetvalue(res, 0, 2);
printf ("Banana values : %u\n", banana_count);
PQclear(res);
do_exit(conn);

Проблема заключается в том, что мои результаты не "9", когда я пытаюсь распечатать с "banana_count", а когда я распечатываю "PQgetvalue (res, 0, 2) 'тогда я получил' 9 ', поэтому я думаю, что у меня есть проблема с конвертацией, но я не могу найти решение. Поэтому мой вопрос заключается в том, как я могу преобразовать 'PQgetvalue (res, 0, 2)' в целочисленную переменную на языке программирования C? (Я использую Ubuntu 18.04 и для компиляции своих фруктов. c с g cc).

Спасибо за поддержку и помощь.

1 Ответ

0 голосов
/ 20 февраля 2020

В C текст технически представляет собой массив символов, за которым следует нулевой термин. Грубо говоря, массив - это указатель на выделенную память известного размера (синтаксис может сильно различаться). Итак, давайте посмотрим код.

PGconn *conn = PQconnectdb("user=un password=pw dbname=db hostaddr=1.2.3.4 port=5432");  //No doubts. It's your professional area.
res = PQexec(conn, "SELECT * FROM fruits WHERE name='banana'");  //same thing.
//int *banan_count; //Aside the typo (banana_count), you don't need a pointer to int! PQgetvalue returns a pointer to char (roughly equal to array of chars, roughly equal to text, you'll learn differences later). This array keeps ONE int value in text form.
int banana_count_2; //That's what you need: a single int value. Not a pointer.
//banana_count = (int)PQgetvalue(res, 0, 2); //Wrong: you take the pointer to char, convert it few times and assign to your int* pointer. Pointer becomes technically valid, but it points to first group of characters, reading them as an integer value (probably char1 + char2*256 + char3*65536 ... depending on your platform). Of course, actual integers are not represented in text form in computer memory, so you get an absurdly huge value (even '0' character has code 48).
banana_count_2 = atoi(PQgetvalue(res,0,2));  //PQgetvalue allocates memory by itself, so the char* it returns points to a valid, allocated memory area. We can say it's an array filled with null-terminated text line, and give this line to atoi();
printf ("Banana values : %u\n", banana_count_2);
PQclear(res);  //Good thing you didn't forget to unallocate the char array!
do_exit(conn);
...