2009-04-29 27 views
32

sqlite3_column_text devuelve un const unsigned char *, ¿cómo convierto esto a std :: string? He intentado std :: string(), pero me sale un error.const unsigned char * to std :: string

Código:

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

error:

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 

Respuesta

39

Usted podría intentar:

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

Mientras std::string podría tener un constructor que toma const unsigned char*, al parecer no es así.

¿Por qué no, entonces? Podrías echar un vistazo a esta pregunta algo relacionada: Why do C++ streams use char instead of unsigned char?

+1

+1. aunque, creo que deberías hacer ese "const char *" dentro de tus corchetes angulares. No querrás tratar de descartar la const-ness (que ni siquiera puede permitir). – rmeador

+0

¡Muy cierto! Gracias por el comentario. – Reunanen

+0

Recibo este error: 1>. \ Storage_manager.cpp (109): error C2440: 'static_cast': no ​​se puede convertir de 'const unsigned char *' a 'const char *' 1> Los tipos apuntados no están relacionados; la conversión requiere reinterpret_cast, molde de estilo C o molde de estilo de función –

4

No estoy familiarizado con sqlite3_column_text, pero una cosa que querrás hacer es cuando llames al constructor std: string, querrás convertir a (const char *). Creo que debería tener un constructor para ese tipo.

Sin embargo, es extraño que esta función sqlite sea return an unsigned char *, ¿está devolviendo una cadena Pascal (la primera char es la longitud de la cadena)? Si es así, entonces tendrá que crear std :: string con los bytes y la longitud.

+0

No, no tienen cierre. – Navin

2

No se puede construir un std::string de c onst unsigned char* - tienes que echarlo a const char* primera:

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

Entonces, ¿no hay forma de hacerlo? –

+0

lo siento, tengo que usar reinterpret_cast en lugar de static_cast. – Kasprzol

2

si temp_doc.uuid es una oportunidad std :: string:

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

Es un std :: string, y probar su método me da: 1>. \ Storage_manager.cpp (109): error C2440: 'static_cast': no ​​se puede convertir de 'const unsigned char *' a 'const char * ' 1> Los tipos apuntados no están relacionados; la conversión requiere reinterpret_cast, molde de estilo C o molde de estilo funcional –

3

intento:

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

Vi a alguien que ya publicó la respuesta, comencé a escribir esta respuesta antes de que se publicara la otra (estaba comprobando que la respuesta es correcta en VS) – user88637

+0

¡Gracias! Funcionó, pero ¿por qué tienes que hacerlo de esa manera? –

+0

Solo lo digo por lo que no creo que copie las respuestas – user88637

17

En la remota posibilidad de que realmente quiere una cadena de unsi personajes señados, puede crear su propio tipo:

typedef std::basic_string <unsigned char> ustring; 

A continuación, debería ser capaz de decir cosas como:

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

La razón la gente suele utilizar un tipo (unsigned char *) es para indicar que los datos son binarios y no texto ASCII simple. Sé que libxml hace esto, y por lo que parece, sqlite está haciendo lo mismo.

Los datos que está obteniendo de la llamada sqlite probablemente sean texto Unicode codificado en UTF-8. Mientras que un reinterpret_cast puede parecer que funciona, si alguna vez alguien almacena texto en el campo que no es ASCII simple, su programa probablemente no se comportará bien.

La clase std :: string no está diseñada teniendo en cuenta Unicode, por lo que si solicita la longitud() de una cadena, obtendrá el número de bytes que, en UTF-8, no es necesariamente lo mismo que la cantidad de personajes.

Respuesta breve: el elenco simple puede funcionar, si está seguro de que los datos son solo ASCII. Si puede ser cualquier dato UTF-8, entonces necesita manejar la codificación/decodificación de una manera más inteligente.

+1

¿Hay alguna manera de hacer esto con std :: library? –

+0

No es que yo sepa. El enfoque estándar es utilizar una biblioteca de terceros, por ejemplo: http://site.icu-project.org/ –

2

No soy un experto pero este ejemplo aquí parece mucho más simple:

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