2013-02-21 34 views
15

Come suggerisce il titolo, la mia domanda è come ottenere la dimensione di una stringa in C. È buono usare sizeof se l'ho dichiarato (la stringa) in una funzione senza malloc in esso? Oppure, se l'ho dichiarato come puntatore? Cosa succede se l'ho inizializzato con malloc? Mi piacerebbe avere una risposta esauriente.Come ottenere la dimensione della stringa in byte?

+1

Non è chiaro dalla tua domanda se ti piacerebbe conoscere la dimensione della "stringa" o la dimensione dell'array di caratteri/blocco di memoria che contiene la "stringa". – alk

+0

@alk Modificato. Spero di essere più chiaro. Grazie. – artaxerxe

risposta

36

È possibile utilizzare strlen. La dimensione è determinata dal carattere null che termina, quindi la stringa passata dovrebbe essere valida.

Se si desidera ottenere dimensioni del buffer di memoria, che contiene la stringa, e si dispone di puntatore ad esso:

  • Se si tratta di array dinamico (creato con malloc), è impossibile ottenere esso dimensione, dal momento che il compilatore non sa a cosa punta il puntatore. (check this)
  • Se è un array statico, è possibile utilizzare sizeof per ottenere le sue dimensioni.

Se si è confusi sulla differenza tra gli array dinamici e statici, selezionare this.

+12

In realtà la dimensione è 'strlen() + 1' (1 per terminare il carattere) –

+6

@ 0x69 La dimensione di una * stringa * viene in genere definita come l'esclusione del terminatore null. – Dukeling

+0

il tipo 'char' in' c' ha sempre una dimensione in byte? – artaxerxe

10

Utilizzare strlen per ottenere la lunghezza di una stringa terminata da null.

sizeof restituisce la lunghezza dell'array non la stringa. Se si tratta di un puntatore (char *s), non di un array (char s[]), non funzionerà, poiché restituirà la dimensione del puntatore (in genere 4 byte nei sistemi a 32 bit). Credo che un array verrà passato o restituito come un puntatore, quindi si perderebbe la possibilità di utilizzare sizeof per verificare la dimensione della matrice.

Quindi, solo se la stringa si estende su tutto matrice (ad es char s[] = "stuff"), sarebbe utilizzando sizeof per un staticamente definito gamma tornare ciò che si vuole (e essere più veloce in quanto non avrebbe bisogno di un ciclo tra di trovare il null-terminator) (se l'ultimo carattere è un terminatore null, sarà necessario sottrarre 1). Se non si estende all'intero array, non restituirà ciò che desideri.

Un'alternativa a tutto ciò è in realtà la memorizzazione della dimensione della stringa.

+2

Nota che 'sizeof' in realtà non ti dà la lunghezza di una stringa. Per una stringa letterale, 'sizeof' include il terminatore null. Per un array di 'char',' sizeof' fornisce il numero di elementi nell'array (che è una quantità imprevedibile maggiore di una lunghezza della stringa del contenuto dell'array) – simonc

+1

Potrebbe essere opportuno sottolineare che 'strlen' e' sizeof' restituisce due cose fondamentali. – alk

+0

@simonc Modificato. – Dukeling

10

Mentre le opere sizeof per questo specifico tipo di stringa:

char str[] = "content"; 
int charcount = sizeof str - 1; // -1 to exclude terminating '\0' 

non funziona se str è puntatore (restituisce sizeof dimensione del puntatore, di solito 4 o 8) o array con lunghezza specificata (sizeof torneranno il conteggio dei byte corrisponde alla lunghezza specificata, che per il tipo di carattere è uguale).

Basta usare strlen().

+0

nell'esempio, poiché str è un nome di tipo non dovrebbe essere tra parentesi? – ramrunner

+0

@ramrunner 'str' è il nome della variabile. È una matrice quindi 'sizeof str' restituirà la dimensione dell'intero array in byte. Quando la matrice è dichiarata come sopra, la dimensione dell'array è esattamente la dimensione della stringa letterale incluso terminare ''\ 0''. E 'sizeof' ha una precedenza più alta di' -', quindi 'sizeof str' non ha bisogno di parentesi, anche se aggiungerle per chiarezza non sarebbe una brutta cosa qui, lo ammetto. – hyde

1

Mi piace usare:

(strlen(string) + 1) * sizeof(char) 

Questo vi darà la dimensione del buffer in byte. È possibile utilizzare questo con snprintf() può aiutare:

const char* message = "%s, World!"; 
char* string = (char*)malloc((strlen(message)+1))*sizeof(char)); 
snprintf(string, (strlen(message)+1))*sizeof(char), message, "Hello"); 

Cheers!Funzione: size_t strlen (const char *s)

+0

(1) 'strlen()' restituisce sempre la lunghezza in byte, moltiplicandola per 1 non aggiunge nulla; (2) Potrebbe non esserci alcuna relazione tra la dimensione del buffer e la lunghezza della stringa che contiene; (3) Hai provato a compilare uno qualsiasi di quel codice? –

+0

(1) Non moltiplicare per uno (2) Sto allocando byte per un puntatore, quindi uso la lunghezza della stringa * sizeof a char (inbytes) (3) Lo uso sempre. –

+0

se vuoi creare un rappresentante, devi farlo fornendo buone risposte. L'ultima modifica rimuove almeno gli errori precedenti, ma ora non è nemmeno una risposta, è un commento. Tutte le altre risposte si riferiscono a 'strlen()' e forniscono alcune spiegazioni significative, ma questa non è una risposta meritevole. –

3

Se si utilizza sizeof() allora un char *str e char str[] restituiranno risposte diverse. char str[] restituirà la lunghezza della stringa (incluso il terminatore di stringa) mentre char *str restituirà la dimensione del puntatore (differisce dal compilatore).

Problemi correlati