2009-05-07 16 views
16

Come si determina la lunghezza di un carattere senza segno *?Come si determina la lunghezza di un carattere senza segno *?

+2

La maggior parte delle risposte indica la necessità di specificare il significato di "lunghezza": numero di elementi, dimensione della variabile contenente il puntatore o si può riferirsi ai caratteri (senza segno?) Una stringa terminata da zero? – xtofl

risposta

21

Per la dimensione effettiva del puntatore:

size_t s = sizeof(unsigned char*); 

Se si desidera che la lunghezza della stringa:

unsigned char* bla = (unsigned char*)"blabla"; 
int s = strlen((char*)bla); 
+5

"blabla" produce una stringa di sola lettura, quindi bla dovrebbe essere const char unsigned *. –

+2

Questo non dovrebbe essere compilato. "blabla" è un const char *, e non è possibile assegnare un const char * a un char unsigned * senza casting. –

+0

Questo non è un compito - è l'inizializzazione - fatto tutto il tempo. –

-3

Con unsigned char * Suppongo che vuoi dire la stringa si trova in quel puntatore. In tal caso sarebbe:

strlen(your_string_pointer) 

Tuttavia, questo troverà solo la posizione \ 0. Non c'è garanzia: questa è l'effettiva dimensione del blocco di memoria allocata.

+0

http: //www.cplusplus.com/reference/clibrary/cstring/strlen ... strlen accetta un "const char *", non un unsigned. – xtofl

8

Ci potrebbero essere due significati. Volete solo sapere quanto è grande il tipo di puntatore? Se è così allora la risposta di Joce è corretta

size_t size = sizeof(unsigned char*); 

Se hai intenzione di sapere quanti elementi fa il punto puntatore, che è un po 'più complessa. Se questa è una stringa in stile C, strlen o qualche variante è la tua migliore opzione.

Tuttavia, se questo è solo un puntatore a un carattere unsigned char che non ha alcuna relazione con una stringa in stile C, non è possibile ottenere in modo affidabile ciò che si sta cercando. C/C++ non associa un campo di lunghezza con un puntatore. Dovrai passare la lunghezza con il puntatore o usare un vettore di classe che memorizza sia il puntatore che la lunghezza.

+1

Hai ragione a non essere in grado di recuperare la lunghezza assegnata - una cattiva decisione di progettazione linguistica agli occhi di molte persone. Ti sbagli se ci sono due significati: potrebbe essere che tu abbia bisogno di conoscere la lunghezza della stringa con terminazione zero contenuta, anche se sarebbe meglio usare un carattere firmato. Rendilo due-e-mezzo :) – xtofl

0

Vuoi la lunghezza del puntatore, che sarebbe un int. Se si desidera la lunghezza della stringa puntata, utilizzare strlen: ad es. dimensioni del puntatore: sizeof (unsigned char *) dimensione della stringa: strlen (unsigned char *) caratteri multibyte otterrà segnalato come ..multi byte

+1

In realtà sarebbe una taglia_t – Tom

+0

Giusto. Avrei dovuto dire size_t – Rohit

0

Se stai usando C++, e la sua una stringa in un char non firmato *, è meglio metterlo prima in una stringa: std :: prima di manipolarlo. In questo modo puoi fare ogni sorta di cose ad esso ed essere comunque in grado di ottenere la lunghezza() e/o la capacità() di esso ogni volta che vuoi.

Suppongo che tu stia facendo cose a detto array per rendere le sue dimensioni non costanti. Se stai solo assegnando, impostando e dimenticando, puoi sempre memorizzare la dimensione effettiva dell'allocazione dell'array in una variabile separata - o meglio, creare una struct/class.

//WARNING: memory issues not addressed here. 
struct myStringStruct 
{ 
    unsigned char * string; 
    int len; 

    allocate(int size) { 
    len = size; 
    string = malloc(sizeof(unsigned char) * len); 
    } 
} 

Più complesso di quello e si sta reinventando std :: string.

6

In un mondo ideale, non è così. Usa char * per le stringhe in stile C (che sono terminate con NUL e puoi misurare la lunghezza di), e char unsigned * solo per i dati di byte (che viene fornito con la sua lunghezza in un altro parametro o qualsiasi altra cosa e che probabilmente entri in un contenitore STL al più presto, ad esempio vector<unsigned char> o basic_string<unsigned char>).

Il problema principale è che non è possibile fare ipotesi portatili sul fatto che le rappresentazioni di memoria di char e unsigned char siano le stesse. Di solito lo sono, ma è permesso loro di non esserlo. Quindi non ci sono funzioni di libreria simili a stringhe che funzionano su char unsigned *, solo su char *, e non è generalmente sicuro trasmettere cast unsigned * a char signed * e trattare il risultato come una stringa. Dal momento che il carattere potrebbe essere firmato, ciò significa che non si esegue il cast di caratteri non firmati * in char *.

Tuttavia, 0 è sempre la stessa rappresentazione di valore in char e char senza segno. Quindi, in un mondo non ideale, se hai una stringa in stile C da qualche parte ma è arrivata come un char non firmato *, allora tu (a) esegui il cast in char * e vai avanti con esso, ma anche (b)) scopri chi ti ha fatto questo e chiedi loro di smettere.

Problemi correlati