Подтвердить что ты не робот

Const unsigned char * to std::string

sqlite3_column_text возвращает const unsigned char *, как мне преобразовать это в std::string? Я пробовал std::string(), но я получаю сообщение об ошибке.

код:

temp_doc.uuid = std::string(sqlite3_column_text(this->stmts.read_documents, 0));

Ошибка:

1>.\storage_manager.cpp(109) : error C2440: '<function-style-cast>' : cannot convert from 'const unsigned char *' to 'std::string'
1>        No constructor could take the source type, or constructor overload resolution was ambiguous
4b9b3361

Ответ 1

Вы можете попробовать:

temp_doc.uuid = std::string(reinterpret_cast<const char*>(
      sqlite3_column_text(this->stmts.read_documents, 0)
  ));

В то время как std::string может иметь конструктор, который принимает const unsigned char*, по-видимому, это не так.

Почему бы и нет? Вы можете посмотреть на этот несколько смежный вопрос: Почему потоки С++ используют char вместо unsigned char?

Ответ 2

В случайном случае вы действительно хотите строку без знаковых символов, вы можете создать свой собственный тип:

typedef std::basic_string <unsigned char> ustring;

Затем вы можете сказать такие вещи, как:

ustring s = sqlite3_column_text(this->stmts.read_documents, 0);

Ответ 3

Причина, по которой люди обычно используют тип (unsigned char *), указывает на то, что данные являются двоичными и не являются ASCII-текстом. Я знаю, что libxml делает это, и, по внешнему виду, sqlite делает то же самое.

Данные, которые вы возвращаете из вызова sqlite, вероятно, кодируются в кодировке Unicode, кодированной UTF-8. Хотя reinterpret_cast может работать, если кто-то когда-либо хранит текст в поле, которое не является простым ASCII, ваша программа, вероятно, не будет хорошо себя вести.

Класс std::string не разработан с учетом Unicode, поэтому, если вы запрашиваете длину() строки, вы получите количество байтов, которое в UTF-8 не обязательно является то же самое, что и количество символов.

Короткий ответ: простой актер может работать, если вы уверены, что данные - это просто ASCII. Если это могут быть любые данные UTF-8, тогда вам нужно более эффективно обрабатывать кодирование/декодирование.

Ответ 4

Я не знаком с sqlite3_column_text, но одна вещь, которую вы, возможно, захотите сделать, - это когда вы вызываете конструктор std: string, который вы хотите применить к (const char *). Я считаю, что он должен иметь конструктор для этого типа.

Однако нечетно, что эта функция sqlite возвращает unsigned char *, возвращает ли она строку Pascal (первая char - длина строки)? Если это так, тогда вам нужно будет создать std::string с байтами и длиной.

Ответ 5

попробовать:

temp_doc.uuid = std::string(reinterpret_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0)));

Ответ 6

Вы не можете построить std::string из c onst unsigned char* - сначала вы должны перенести его на const char*:

temp_doc.uuid = std::string( reinterpret_cast< const char* >(
  sqlite3_column_text(this->stmts.read_documents, 0) ) );

Ответ 7

если temp_doc.uuid является std::string try:

temp_doc.uuid = static_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0));

Ответ 8

Я не эксперт, но этот пример выглядит намного проще:

string name = (const char*) (sqlite3_column_text(res, 0));