Che cos'è una 'stringa terminata da null'?

6

Ho appena iniziato a leggere C ++ e mi sono imbattuto in un termine "Null Terminated String", ho letto su di esso ma non riuscivo a capire cosa significasse in realtà.

Voglio anche sapere qual è la differenza tra una c-string (anche chiamata "Null terminated String") e una stringa c ++.

    
posta user1606191 04.01.2013 - 13:09
fonte

6 risposte

16

Risposta breve: una stringa terminata null è un array di caratteri con un valore null (0x00) dopo l'ultimo carattere valido nella stringa.

Risposta lunga:

È importante ricordare che non tutti i compilatori C e C ++ inizializzeranno i valori per te. AFAIK, la maggior parte no.

Una stringa di base in C o C ++ (senza STL) è semplicemente un array di caratteri.

char myString[25];

Al momento, abbiamo nessuna idea cosa c'è all'interno di quella stringa. Potrebbe essere vuoto; potrebbe avere caratteri garbage (molto probabilmente); o potrebbe avere informazioni significative. Tutto dipende da cosa c'era in quel segmento di memoria prima che fosse dichiarata la matrice.

Notare che qui abbiamo 24 caratteri di archiviazione, e il null prenderà il 25 ° carattere.

È prassi comune precompilare e cancellare una stringa con valori null per sbarazzarsi di qualsiasi rifiuto.

memset(myString, 0x00, 25);

Si noti che in questo caso sto usando una dichiarazione esadecimale di 0 per indicare NULL. Alcuni compilatori e / o librerie hanno un valore NULL o simile definito.

Molte delle funzioni di base della stringa come strcmp , strcat , ecc. si basano su stringhe terminate null per indicare la fine della stringa. Se non lo hai terminato, la funzione di stringa può essere eseguita alla fine della stringa e non agire come ci si aspetterebbe.

La stringa STL C ++ è un oggetto reale e si occupa di alcuni di questi problemi di inizializzazione / terminazione per te.

    
risposta data 04.01.2013 - 13:23
fonte
12

Nella programmazione per computer, una stringa terminata da null è una stringa di caratteri memorizzata come una matrice contenente i caratteri e terminata con un carattere null ('\ 0', chiamato NUL in ASCII).

link

    
risposta data 04.01.2013 - 13:14
fonte
4

Ci sono alcune risposte eccellenti in questa discussione, ma vorrei aggiungere una per una persona che ha imparato la programmazione del computer partendo da un linguaggio strongmente tipizzato come Java o C #, e mai programmato in un linguaggio tipizzato debole come C o C ++.

(Si noti che sto parlando della tipizzazione strong o debole, non della tipizzazione dinamica rispetto a quella statica.La definizione esatta di tipizzazione debole è una discussione affascinante da sola, ma al di fuori dello scopo di questa risposta:)

Per comprendere le stringhe con terminazione nulla, dobbiamo iniziare dal modo in cui i dati vengono archiviati in sistemi con errori tipografici. In questi sistemi l'intera memoria è solo una grande sequenza di byte e il programma ha accesso a qualsiasi di questi byte in qualsiasi momento. Spetta al programma interpretare correttamente i byte. Ad esempio, quando il programma deve leggere un numero intero a 32 bit sull'indirizzo A1, legge 4 byte a partire dall'indirizzo A1 e li interpreta come un singolo intero a 32 bit. Sa che il numero intero a 32 bit è di 4 byte di dimensione, quindi non è necessario avere alcun marcatore per dove dovrebbe finire il numero intero.

Questo non è vero per le stringhe di testo, che nella maggior parte delle lingue possono avere dimensioni arbitrarie e sono rappresentate da un singolo byte per carattere (o 2 byte per stringhe UNICODE). Quindi conoscere l'indirizzo iniziale di una stringa non significa che il programma sappia dove finisce la stringa. Tieni presente che, nelle lingue con caratteri non corretti, nulla impedisce al programma di leggere la memoria oltre la fine della stringa e di continuare a interpretare i byte che rappresentano i dati memorizzati dietro la stringa come ulteriori caratteri.

Quindi per leggere una stringa di testo sull'indirizzo A2 il programma ha bisogno di sapere quanto è lunga la stringa, in modo che sappia quanti byte dovrebbe leggere. Alcuni linguaggi si occuperanno di esso memorizzando la dimensione della stringa di testo nel primo byte (o 2 o anche 4 byte). Una stringa "pippo" potrebbe essere lunga 4 byte e apparire come segue:

3 102 111 111

dove 3 è la lunghezza della stringa e 102 e 111 sono codici ASCII per i caratteri "f" e "o". Questo è piuttosto semplice, ma limita la lunghezza massima di qualsiasi stringa, in questo caso a 255 caratteri (poiché 255 è il valore intero massimo che può essere memorizzato in un singolo byte che abbiamo usato per mantenere la lunghezza della stringa).

Un altro modo di affrontare questo problema è contrassegnare la fine della stringa, e questo è esattamente ciò che fa una stringa con terminazione null. Usa un carattere NULL rappresentato dal valore ASCII di 0 (zero). Quindi la stessa stringa "pippo" potrebbe assomigliare a questo:

102 111 111 0

Si noti che in questo caso non esiste un limite per la lunghezza di una stringa che può essere rappresentata in questo formato e il sovraccarico della rappresentazione è sempre esattamente un byte (lo zero finale). Ovviamente le stringhe di testo contenenti il carattere NULL non possono essere rappresentate come stringhe con terminazione nulla.

    
risposta data 25.01.2013 - 07:31
fonte
2

Le stringhe con terminazioni nulle non sono come le stringhe nella maggior parte delle altre lingue. Sono il modo standard per rappresentare le stringhe in C, come nient'altro che una serie di caratteri in ordine sequenziale. In una lingua come C ++, una stringa è un oggetto reale con parametri e cose.

Il problema con questa serie di caratteri è, come sai quando smettere di leggere, dove è la fine della stringa? Poiché il carattere null non viene utilizzato per nient'altro, viene utilizzato per terminare la stringa, ovvero contrassegnare l'endpoint.

    
risposta data 04.01.2013 - 15:52
fonte
1

Per prima cosa rispondere alla seconda domanda, una stringa C ++ è un'istanza della classe std::string che fa parte della libreria standard C ++.
Una stringa c (o una stringa in stile c, o una stringa terminata da NUL) è una sequenza di caratteri che termina con il primo carattere 'std::string' (ASCII NUL).

Una differenza importante è che un '%code%' può contenere caratteri NUL incorporati nei suoi contenuti, ma una stringa in stile C non può per definizione (poiché termina con il primo carattere NUL).

Quindi, il termine 'NUL terminated string' (spesso "errato" come null-terminated) deriva dal fatto che tale stringa termina con (è terminato da) un carattere NUL ( %code% ).

    
risposta data 04.01.2013 - 15:44
fonte
1

Una stringa con terminazione null è una sequenza di caratteri con un carattere con valore 0 finale. Quindi una stringa come "Hi" è rappresentata come la sequenza {72, 105, 0} (ASCII). Lo 0 è un valore sentinella che indica la fine della stringa. Le funzioni della libreria di stringhe C ( strcmp , strcpy , ecc.) Si basano sulla presenza di quel byte 0 per funzionare correttamente.

Questo è diverso dalle stringhe BASIC Pascal o old-school che memorizzavano la lunghezza della stringa nel byte principale ( {2, 72, 105} ).

In C, le stringhe sono archiviate in matrici di char .

La classestring di C ++% utilizza stringhe con terminazione null sotto il cofano (almeno nelle implementazioni con cui ho familiarità), ma la sua interfaccia è tale che normalmente non ti devi preoccupare di quel livello di dettaglio.

    
risposta data 04.01.2013 - 16:06
fonte

Leggi altre domande sui tag