Come si determina la lunghezza di un carattere senza segno *?Come si determina la lunghezza di un carattere senza segno *?
risposta
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);
"blabla" produce una stringa di sola lettura, quindi bla dovrebbe essere const char unsigned *. –
Questo non dovrebbe essere compilato. "blabla" è un const char *, e non è possibile assegnare un const char * a un char unsigned * senza casting. –
Questo non è un compito - è l'inizializzazione - fatto tutto il tempo. –
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.
http: //www.cplusplus.com/reference/clibrary/cstring/strlen ... strlen accetta un "const char *", non un unsigned. – xtofl
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.
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
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
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.
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.
- 1. Come si determina la lunghezza di un Fixnum in Ruby?
- 2. Come stampare un carattere senza segno in C?
- 3. Come ottenere la lunghezza del carattere **?
- 4. Come si ottiene un lungo senza segno da una stringa?
- 5. Per stampare il valore all'interno di un puntatore di un carattere senza segno
- 6. Come posizionare un segno di spunta come carattere?
- 7. UUID lunghezza carattere max
- 8. Come si può facilmente calcolare la radice quadrata di un long lungo senza segno in C?
- 9. Moltiplicazione con segno e senza segno
- 10. Determina la lunghezza della stringa netta al momento della compilazione
- 11. Come si stampa un segno '%' usando la formattazione della stringa?
- 12. JavaScript Ottieni la lunghezza reale di una stringa (senza entità)
- 13. Converti in modo efficiente un corto senza segno in un carattere *
- 14. valori senza segno C
- 15. Primitive negative senza segno?
- 16. Come si definisce la lunghezza Sequelize.STRING?
- 17. Come convertire il carattere unicode di 00B0 (segno di laurea)?
- 18. Come si determina il percorso fisico di un file senza HttpContext?
- 19. Come ottenere la lunghezza di std :: stringstream senza copiare
- 20. Come si determina HResult per System.IO.IOException?
- 21. Come firmare l'assemblaggio senza segno in un pacchetto nuget?
- 22. Come cambio il carattere di un UILabel in swift senza modificare la dimensione del carattere?
- 23. Come si determina l'autore di un pacchetto R?
- 24. PHP: come si determina ogni ennesima iterazione di un ciclo?
- 25. max senza diramazione per interi senza segno
- 26. Carattere del segno del dollaro nelle stringhe
- 27. Determina la rotazione di un CALayer
- 28. PHP: strlen restituisce la lunghezza del carattere anziché la lunghezza del byte
- 29. Le parentesi fanno la differenza quando si determina la dimensione di un array?
- 30. Si può inizializzare una stringa Java con un singolo carattere ripetuto ad una specifica lunghezza
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