2009-03-10 6 views
22

È definito strlen(const char *s) quando s non è terminato da null e, in caso affermativo, cosa restituisce?strlen() su stringa di caratteri non terminata da null?

+8

Chiedetevi: Come dovrebbe strlen() sapere dove finisce la stringa, se non è terminata con null? – DevSolar

+1

Tecnicamente parlando, non esiste una stringa C che non sia NUL-terminata, perché il NUL-Terminator è definito come parte della stringa C :) – fredoverflow

risposta

30

No, non è definito. Potrebbe verificarsi una violazione di accesso alla memoria, poiché continuerà a contare fino a raggiungere il primo byte di memoria il cui valore è 0.

+13

Può anche far demoneggiare i demoni. http://catb.org/jargon/html/N/nasal-demons.html –

+2

Questo spiega le mie narici doloranti. –

1

Restituirà il numero di caratteri rilevati prima che venga trovato '\ 0'.

+0

....... oppure no. – alk

1

Non è definito. Provoca un comportamento indefinito che significa che tutto può accadere, molto probabilmente il tuo programma si bloccherà.

-2

È sempre definito.

Restituisce la lunghezza della "stringa" finché non raggiunge un byte con un valore null. Cattiva idea perché ciò può causare un overflow del buffer.

+2

No, non è definito. Una volta che si inizia a superare lo spazio che è stato allocato per la stringa, tramite malloc o stack/heap, i risultati sono rigorosamente indefiniti. Correzione –

9

Dalla serie C99:

La funzione strlen restituisce il numero di caratteri che precedono il terminazione carattere nullo.

Se non è presente un carattere null, il risultato non è definito.

0

strlen() funziona solo (fa qualcosa di utile) su stringhe con terminazione null; otterrai un risultato completamente indefinito se passi in qualcosa di diverso da quello. Se sei fortunato, non causerà un crash :)

+2

, se è fortunato si bloccherà. Non vorresti che questo tipo di errore passasse inosservato :-P. –

2

Se la stringa non è terminata NUL, la funzione continuerà a cercare finché non la trova.

Se sei fortunato, questo causerà l'arresto anomalo del programma.

Se non siete fortunati, otterrete una lunghezza maggiore del previsto, con molti valori "inattesi".

5

Potrebbe essere necessario strnlen?

+5

Sfortunatamente, questo non fa parte della standard C. – joveha

0

man 3 strcspn

size_t strcspn (const char * s, const char * reject);

Una lunghezza di due punti delimitati da corde:

size_t len = strcspn(str, ":"); 

Una lunghezza di delimitati da virgole stringhe:

size_t len = strcspn(str, ","); 

Una lunghezza di tab delimitato da corde:

size_t len = strcspn(str, "\t"); 
Problemi correlati