2009-04-29 16 views
32

sqlite3_column_text restituisce un char const unsigned *, come posso convertirlo in una stringa std :: string? Ho provato std :: string(), ma ottengo un errore.const unsigned char * a std :: string

Codice:

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

Errore:

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 

risposta

39

Si potrebbe provare:

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

Mentre std::string potrebbe avere un costruttore che accetta const unsigned char*, a quanto pare non è così.

Perché no, allora? Potresti dare un'occhiata a questa domanda in qualche modo correlata: Why do C++ streams use char instead of unsigned char?

+1

+1. sebbene, penso che dovresti fare quel "const char" dentro le parentesi angolari. Non vuoi provare a gettare via la costanza (che potrebbe anche non consentire). – rmeador

+0

Molto vero! Grazie per l'osservazione. – Reunanen

+0

Viene visualizzato questo errore: 1>. \ Storage_manager.cpp (109): errore C2440: 'static_cast': impossibile convertire da 'const unsigned char *' a 'const char *' 1> I tipi a cui punta non sono correlati; la conversione richiede reinterpret_cast, cast in stile C o cast in stile funzione –

4

Non ho dimestichezza con sqlite3_column_text, ma una cosa che potresti voler fare è quando chiami lo std: costruttore di stringhe, vuoi cast (const char *). Credo che dovrebbe avere un costruttore per quel tipo.

Tuttavia, è strano che questa funzione sqlite restituisca un char unsigned *, restituisce una stringa Pascal (il primo char è la lunghezza della stringa)? Se è così, allora dovrai creare la std :: string con i byte e la lunghezza.

+0

No, sono nulli terminati. – Navin

2

Non si può costruire un std::string da c onst unsigned char* - dovete gettarlo ai const char* prima:

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

Quindi - non c'è assolutamente niente? –

+0

scusa, devo usare reinterpret_cast invece di static_cast. – Kasprzol

2

se temp_doc.uuid è una prova std :: string:

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

È una stringa std :: e provando il metodo mi dà: 1>. \ Storage_manager.cpp (109): errore C2440: 'static_cast': impossibile convertire da 'const unsigned char *' a 'const char * ' 1> I tipi indicati non sono correlati; la conversione richiede reinterpret_cast, cast in stile C o cast in stile funzione –

3

provare:

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

Ho visto che qualcuno ha già postato la risposta, ho iniziato a scrivere questa risposta prima che l'altra fosse pubblicata (stavo verificando che la risposta fosse corretta in VS) – user88637

+0

Grazie! Ha funzionato - ma perché hai bisogno di farlo in quel modo? –

+0

Sto solo dicendo così non penserò di copiare le risposte – user88637

17

Nella remota possibilità che si desideri effettivamente una stringa di caratteri gnata, è possibile creare il proprio tipo:

typedef std::basic_string <unsigned char> ustring; 

Si dovrebbe quindi essere in grado di dire le cose come:

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

La ragione per le persone in genere utilizzano un tipo (unsigned char *) è per indicare che i dati sono binari e non semplici testi ASCII. So che libxml fa questo, e dal suo aspetto, sqlite sta facendo la stessa cosa.

I dati che stai recuperando dalla chiamata sqlite sono probabilmente testo Unicode con codifica UTF-8. Mentre un reinterpret_cast può sembrare funzionare, se qualcuno memorizza del testo nel campo che non è un semplice ASCII, probabilmente il tuo programma non sarà ben educato.

La classe std :: string non è progettata con in mente Unicode, quindi se si richiede la lunghezza() di una stringa, si otterrà il numero di byte, che, in UTF-8, non è necessariamente la stessa cosa del numero di caratteri.

Risposta breve: il cast semplice può funzionare, se si è certi che i dati sono solo ASCII. Se possono essere dati UTF-8, è necessario gestire la codifica/decodifica in modo più intelligente.

+1

C'è un modo per farlo con std :: library? –

+0

Non che io sappia. L'approccio standard consiste nell'utilizzare una libreria di terze parti, ad esempio: http://site.icu-project.org/ –

2

Non sono un esperto, ma questo esempio qui sembra molto più semplice:

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