





Вы можете использовать sprintf (), но вам все равно нужно знать длину строки, содержащейся в row [0], чтобы вы могли выделить достаточно памяти.
Предостережение: BCS правильно указывает, что ваши данные будут усечены, если строка [0] содержит лишние нулевые байты. Если вы знаете, сколько данных хранится в строке [0], использование memcpy (), вероятно, будет лучшим решением.
Формат% s должен принимать только char *, поэтому из вашего описания похоже, что MYSQL_ROW действительно char **, а принятие row [0] в любом случае даст char *.
Я не понимаю, как использование sprintf () (или более безопасного, но нестандартного asprintf ()) принесет какую-либо пользу, но вы можете подумать об этом, если вам станет легче.
Кажется, что любая форма манипуляции дает мне ошибку во время выполнения. преобразование его в строку, strcpy, sprintf и т. д. и т. д. Так что кто-нибудь нашел способ? Трудно поверить, что API позволит пользователям только получать результаты и распечатывать их, но не позволяет сохранять их в памяти.
But what if I want to transfer the contents of row[0] into a string or a char*?
Используйте mysql_fetch_lengths, чтобы определить длину массива в MYSQL_ROW. Поскольку в строке 1 или несколько столбцов, длина может быть 1 или более.
Согласно документации 27.8.5 Структуры данных C API:
MYSQL_ROWThis is a type-safe representation of one row of data. It is currently implemented as an array of counted byte strings. (You cannot treat these as null-terminated strings if field values may contain binary data, because such values may contain null bytes internally.) Rows are obtained by calling
mysql_fetch_row().
Затем в документации mysql_fetch_row приводится этот пример:
MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;
num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
unsigned long *lengths;
lengths = mysql_fetch_lengths(result);
for(i = 0; i < num_fields; i++)
{
printf("[%.*s] ", (int) lengths[i],
row[i] ? row[i] : "NULL");
}
printf("\n");
}
Вот пример его использования для подсчета строк в таблице. Таблица была заполнена из Нарушения "Не звонить" FTC.
MYSQL_RES* res = NULL;
MYSQL row;
const char SELECT_STMT[] = "SELECT COUNT(*) FROM blacklist_ftc";
if (mysql_query(mysql, SELECT_STMT) != 0)
{
/* handle error */
goto finish;
}
if ((res = mysql_store_result(s_mysql)) == NULL)
{
/* handle error */
goto finish;
}
if (mysql_num_fields(res) != 1 || mysql_num_rows(res) != 1)
{
/* handle error */
goto finish;
}
char buf[32];
unsigned long* length;
row = mysql_fetch_row(res);
length = mysql_fetch_lengths(res);
if (row == NULL || length == NULL)
{
/* handle error */
goto finish;
}
size_t size = length[0] < sizeof(buf)-1 ? length[0] : sizeof(buf)-1;
memcpy(buf, row[0], size);
buf[size] = '\0';
unsigned long count = (unsigned long)atoi(buf);
finish:
if (res)
{
mysql_free_result(res);
res = NULL;
}
Однако имейте в виду, что если вы это сделаете, он остановится на первом \ 0