2009-11-25 8 views
53

Qual è il modo più affidabile per verificare se un array di caratteri è vuoto?Il modo migliore per verificare se un array di caratteri è vuoto

char text[50]; 

if(strlen(text) == 0) {} 

o

if(text[0] == '\0') {} 

o devo fare

memset(text, 0, sizeof(text)); 
if(strlen(text) == 0) {} 

cosa è il modo più efficace per andare su questo?

+1

Quindi ti stai chiedendo se è necessario eseguire il test per null o se è necessario impostare la stringa su tutti 0 e quindi verificare 0? –

+0

Sì, non ero sicuro di poter provare una stringa come NULL se l'ho appena dichiarata e non ho fatto nulla con essa prima. – ZPS

risposta

56

Dato questo codice:

char text[50]; 
if(strlen(text) == 0) {} 

Seguirà una domanda su questo codice:

memset(text, 0, sizeof(text)); 
if(strlen(text) == 0) {} 

I odore confusione. In particolare, in questo caso:

char text[50]; 
if(strlen(text) == 0) {} 

... il contenuto del text[] sarà inizializzato e indefinito. Pertanto, strlen(text) restituirà un risultato non definito.

Il modo più semplice/veloce per assicurare che una stringa C viene inizializzato alla stringa vuota è semplicemente impostare il primo byte a 0.

char text[50]; 
text[0] = 0; 

Da allora, sia strlen(text) e molto veloce ma -not-as-straightforward i test (text[0] == 0) rileveranno entrambi la stringa vuota.

+1

Ho strutturato male, intendevo per il memset (testo, 0, sizeof (testo)); per venire subito dopo il testo char [50]; perché non ero sicuro se fosse una cattiva pratica strlen un array di char prima che fosse assegnato qualcosa. – ZPS

+1

È certamente una cattiva idea creare un array prima che venga assegnato - strlen passerà attraverso la memoria fino a raggiungere un byte 0, che potrebbe essere ben oltre la fine dell'array. –

18

Dipende dalla presenza o meno di una stringa con terminazione null sulla matrice. Se è così, allora

if(text[0] == '\0') {} 

dovrebbe essere sufficiente.

Edit: Un altro metodo sarebbe ...

if (strcmp(text, "") == 0) 

che è potenzialmente meno efficiente ma è chiaro che esprime la vostra intenzione.

4

Il secondo metodo sarebbe quasi sicuramente il modo più veloce per verificare se una stringa con terminazione null è vuota, poiché implica un confronto di lettura e uno. Sicuramente non c'è niente di sbagliato in questo approccio, quindi puoi anche usarlo.

Il terzo metodo non controlla se un array di caratteri è vuoto; assicura che un array di caratteri sia vuoto.

7

Questo funzionerà per trovare se un array di caratteri è vuoto. Probabilmente è anche il più veloce.

if(text[0] == '\0') {} 

Questo sarà anche veloce se l'array text è vuoto. Se contiene caratteri, deve prima contare tutti i caratteri in esso contenuti.

if(strlen(text) == 0) {} 
+1

Non utilizzare strlen per verificare se un cstring è vuoto. Non è un'operazione a tempo costante. –

+0

Quale è quello che spiego nella risposta. –

4

Il secondo è il più veloce. L'utilizzo di sarà chiuso a se la stringa è effettivamente vuota, ma strlen eseguirà sempre l'iterazione di ogni carattere della stringa, quindi se è non vuoto, farà molto più lavoro del necessario.

Come già detto da James, la terza opzione cancella la stringa prima di controllare, quindi il controllo avrà sempre esito positivo ma non avrà alcun significato.

2
if(text[0] == '\0') {} 

uso questo se il codice per i microcontrollori con poco spazio su flash e RAM, si sprecherà molto di più flash utilizzando strlen che con il controllo del primo byte. quanto sopra è il più veloce è stato con meno computazione pure.

Problemi correlati