Numero di elementi in un array char

Che tipo di funzione posso usare per sapere quanti elementi ci sono in un array char?

sizeof () fornisce il numero di “spazi” disponibili, quindi non funziona per me.

Commenti

  • Puoi fare un esempio per favore? ad es. char foo [100] = "bar"; – è questo che intendi? Vuoi la risposta: 3?
  • sì, ' s giusto

Risposta

Vuoi strlen.

 char foo [100] = "bar"; Serial.println (strlen (foo)); // --> prints 3  

Commenti

  • Se la risposta ha funzionato per te, fai clic sul pulsante " accetta " (sembra un segno di spunta). In questo modo gli altri sapranno che il soluzione ha funzionato.
  • Ho dovuto aspettare un paio di minuti per farlo
  • Nota che questo funzionerà solo se i dati nel tuo contiene una stringa ascii ed è correttamente terminata da null. Inoltre, se hai una stringa lunga nel char[] e la sovrascrivi con una stringa più corta senza aggiungere la terminazione nulla, otterrai la dimensione della stringa precedente.
  • Abbastanza giusto. La mia risposta era per la domanda presentata. Le cose che menzioni dovrebbero essere prese in considerazione per le stringhe C con terminazione null.

Answer

Ti conosco ho ricevuto la tua risposta da @NickGammon, ma vorrei aggiungere informazioni un po più approfondite su come funziona tutto questo.

sizeof() non è un funzione nel senso normale della parola. È un operatore che ti dà il numero di byte di memoria allocati a qualunque cosa gli passi. Se gli passi un array, restituisce il numero di byte che larray ha a disposizione. Se gli passi un puntatore a un array, restituisce la dimensione di quel puntatore, non la dimensione dellarray. Se gli passi una variabile intera restituisce il numero di byte usati da quella variabile intera (2 su un 8 bit sistema come AVR, 4 su un sistema a 32 bit come il Due).

Quindi alcuni esempi:

char array[50] = "hello"; // sizeof(array) = 50. char *array_p = array; // sizeof(array_p) = 2 or 4 depending on architecture. char single = "a"; // sizeof(single) = 1. char string[] = "hello"; // sizeof(string) = 6 (5 letters plus \0) - it allocates the memory at compile time to fit the string 

Ora strlen(). In cosa differisce esattamente da sizeof()? In poche parole, conta il numero di caratteri in un array di caratteri fino a raggiungere il carattere \0 che è il carattere di terminazione” NULL “di una stringa C. Prendiamo gli esempi precedenti ma usiamo invece strlen:

char array[50] = "hello"; // strlen(array) = 5. char *array_p = array; // strlen(array_p) = 5. char single = "a"; // strlen(single) = ERROR! strlen() doesn"t operate on single characters. char string[] = "hello"; // strlen(string) = 5. 

Notate che restituisce sempre il numero di caratteri nella stringa fino a, ma non incluso, il carattere \0 finale.

Nella sua forma più semplice la funzione strlen() potrebbe essere simile a questa:

int strlen(const char *data) { int c = 0; const char *p = data; while (*p) { c++; p++; } return c; } 

Fondamentalmente inizia dal primo carattere nella stringa (*p = data), esamina se “sa \0 o meno (while (*p)), incrementa il conteggio dei caratteri (c++) e passa al carattere successivo nella stringa (p++).

Se vuoi scorrere la stringa nel tuo programma puoi chiamare strlen() prima per ottenere il numero di caratteri nella stringa, quindi usa quel valore in un ciclo. Questo è un po dispendioso, poiché strlen() prima itera la stringa, quindi finisci per iterarla due volte. È molto più efficiente imparare come scorrere al meglio ogni carattere nella stringa finché non trovi il carattere di terminazione, ad esempio il modo in cui la funzione strlen() utilizza il puntatore per spostarsi nella memoria. Puoi anche vedere quanto sia importante assicurarsi che il carattere \0 esista alla fine della stringa, altrimenti come funzionerà come strlen() sai quando fermarti? Non possono “sapere quanto è lunga la stringa (sizeof() restituirà la dimensione del puntatore passato, non la dimensione dellarray), quindi devono avere una sorta di marcatore manuale e la convenzione in C è quella di usare \0.

Nota che print() di Arduino funziona effettivamente fallo in modo molto inefficiente. Se fai qualcosa del tipo:

char message[] = "Hello"; Serial.println(message); 

in realtà farà un bel po di lavoro che non “t realmente necessario. passo dopo passo:

  1. chiama println (messaggio)
  2. che chiama write (messaggio)
  3. che ottiene la lunghezza della stringa con strlen (messaggio)
  4. e chiama write (message, length)
  5. che poi passa da 0 a length-1 inviando a turno ogni carattere del messaggio a write ().
  6. infine stampa il \r\n per la nuova riga.

Quindi in realtà finisce annidato intorno a 4 funzioni in profondità e itera lintera stringa due volte. A classico esempio di come sprecare tempo di lavorazione.Ripetendo la stringa una volta cercando il carattere \0 nella funzione write(message) (passaggio 2), funzionerebbe almeno due volte più velocemente. Buon vecchio Arduino …

Commenti

  • Re “Nella sua forma più semplice la funzione strlen () potrebbe assomigliare a questa”, in un breve ( forse più semplice?) potrebbe essere simile a: int strlen(const char *data) { const char *p = data; while (*p++); return p-data-1; }
  • @ jwpat7 Ho detto " semplice ", non " più corto e compatto ". Quella forma, sebbene più piccola ed efficiente, è molto più difficile da comprendere per lOP (che ovviamente non è un programmatore).
  • Daccordo 🙂 È anche più facile commettere errori in E se \0 è lultimo byte accessibile in un segmento, *p++ avrà un errore. Ma int strlen(const char *data) { const char *p = data; while (*p) ++p; return p-data; } evita questo problema.
  • In realtà, *p++ ha vinto ' t errore anche se \0 è lultimo byte accessibile in un segmento; la parte *p accederà allultimo byte; la parte ++ imposterà p su un indirizzo non valido; ma poiché quellindirizzo non valido ' non viene referenziato, su una macchina tipica non si verifica alcun errore.
  • È una macro in fase di compilazione … ' non è una macro , ' è un operatore (come " + " e " – " sono operatori). Sono di livello inferiore rispetto alle macro che vengono eseguite al momento del pre-processore. Vedi operatore sizeof . Inoltre Operatori in C ++

Answer

 use sizeof char nnn[10]; for(int i=0; i< sizeof(nnn)/sizeof(char); i++){ } 

Commenti

  • Hai letto correttamente la domanda?
  • LOP ha detto sizeof " ' non funziona per me " e quindi suggerisci di usare sizeof.
  • non puoi rispondere alla domanda quando usi lo stesso sconosciuto

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *