Ciao e bentornato. In questa
lezione, voglio parlare della creazione di una stringa, in
particolare di come puoi farlo in c usando un array di caratteri.
Tendo a usare i termini stringa e stringhe di caratteri in modo intercambiabile.
Ma in realtà una stringa di caratteri è l'array di caratteri di cui parleremo.
È un concetto molto importante.
Ora saremo in grado di utilizzare parole e testo nel nostro programma per fare ogni genere di cose.
Ora lo stesso c non ha alcun tipo di dati che rappresenta una stringa.
Non c'è niente lì. Molte lingue supportano un
oggetto o un tipo di dati di tipo stringa.
Poiché non è presente alcun tipo di dati c nella stringa, non
è possibile utilizzare nessuno degli operatori sulla stringa.
Quindi quello che finiremo per fare è che finiremo per usare la libreria standard e ci sono tutti
i tipi di funzioni di stringa di cui parleremo.
Abbiamo tre lezioni dedicate alle varie funzioni delle stringhe che puoi utilizzare.
E questo ci aiuterà a manipolare le stringhe, ottenere informazioni sulle stringhe.
Ma non puoi utilizzare operatori su stringhe, nessun plus o
minusing stringhe, niente del genere.
Le stringhe in c sono archiviate in una matrice di tipo char.
Sappiamo cos'è un array. Sappiamo cos'è un tipo char.
Un tipo char è un singolo carattere, un array in cui puoi
semplicemente memorizzare più elementi con lo stesso nome.
Quindi ha senso che una stringa si trovi all'interno di un array di caratteri
perché una stringa è composta da molti molti caratteri.
Quindi i caratteri di una stringa vengono memorizzati in celle di memoria adiacenti, un carattere per cella.
Puoi accedervi proprio come accedi anche a un array.
Ma il modo in cui dichiareresti effettivamente una stringa e vedresti è che useresti semplicemente il tipo
char e poi le parentesi per indicare la dimensione, proprio come un normale array
se dovessi crearlo di un tipo diverso.
Carattere e poi qualunque sia il tuo nome e poi la dimensione
della matrice di caratteri tra parentesi quadre.
È così che puoi dichiarare una stringa in c.
Ora, quando dichiari la stringa in c in questo modo, non
ci sono dati effettivi associati a. Stai solo specificando la dimensione.
È il modo più semplice.
Quindi la variabile può contenere una stringa che contiene fino a 19 caratteri.
Ricorda questo carattere nullo.
Se dici che la dimensione della tua stringa sarà 20, significa che solo 19
caratteri possono essere effettivamente memorizzati perché
devi avere quel carattere in più per il null.
Tieni presente che, dichiarare un array di caratteri è 20 significa che
19 caratteri possono essere memorizzati lì.
Quando si specifica la dimensione di un array che si intende utilizzare prima di una stringa,
per memorizzare una stringa,
deve essere almeno uno maggiore del numero di caratteri nella stringa che si desidera memorizzare.
Il compilatore aggiungerà automaticamente il terminatore nullo alla fine di ogni costante di stringa.
Quindi quello che dovresti fare veramente è quando
crei queste stringhe di caratteri, dovresti inizializzarle.
Quindi puoi inizializzare una variabile stringa proprio come puoi inizializzare un array.
Metti ogni carattere all'interno di queste parentesi.
Quindi questo sembra molto simile a se dovessi inizializzare gli elementi in un array di numeri interi.
Ma se dici una parola char e poi
all'interno delle parentesi ondulate inserisci ogni singolo carattere che
creerebbe un array di caratteri.
Quindi è uguale a qualsiasi altra inizializzazione di array.
In assenza di inserire la dimensione, il
compilatore c calcola automaticamente il numero di elementi nell'array e quindi ne aggiunge uno per il terminatore null.
Quindi si basa sul numero di inizializzatori che hai tra
parentesi graffe.
Questa affermazione riserverà spazio e memoria per esattamente sette
caratteri, punto esclamativo h-e-l-l-o e
poi il terminatore nullo, e questo piccolo diagramma a destra lo mostra.
Automaticamente e aggiungendo quel terminatore nullo. Ora sarebbe davvero
una seccatura se dovessi sempre inizializzare i
tuoi array di caratteri con virgolette singole seguite da virgole.
Quindi quello che puoi fare è anche la notazione abbreviata è puoi semplicemente mettere le virgolette doppie intorno a questo.
Quindi puoi specificare la stringa in modo esplicito, come nel primo esempio, e
quindi dovresti effettivamente utilizzare una funzione stringa solo per applicare
i dati ad essa o
puoi lasciare che il compilatore lo faccia per te.
Il problema con farlo in modo esplicito è che devi sempre ricordarti di aggiungere quel carattere extra
per il null.
Quindi quello che dovresti fare veramente è lasciare che sia il compilatore a capirlo per te.
Quindi non inserire alcun numero all'interno di quelle parentesi per la dimensione.
Perché se la dimensione specificata è troppo piccola, il compilatore non può contenere il
carattere nullo di terminazione alla fine dell'array e non ne inserisce uno lì e non
ti dirà che non ne ha messo uno lì.
Quindi avrai un bug nel tuo programma e non lo saprai nemmeno.
La migliore pratica è quando si utilizza una stringa letterale
e si inizializza una stringa per consentire al compilatore di calcolare la dimensione per te.
Rendilo più grande o qualcosa del genere e poi mettilo lì e scoprirà la dimensione per te.
Quindi non specificare la dimensione. Lascia che sia il compilatore a capirlo.
In questo modo puoi essere sicuro che sarà corretto.
Basta lasciare quelle parentesi come parentesi vuote
e assegnarle con l'operatore di assegnazione, quindi tra virgolette
doppie puoi semplicemente metterle. Non hai nemmeno bisogno delle parentesi quadre.
Questa è la migliore pratica. Faremo un esempio.
Puoi anche inizializzare solo una parte di un
array di elementi di tipo char con una stringa.
Quindi, se hai effettivamente creato una dimensione che era davvero grande e
hai assegnato solo un paio di caratteri, va bene
anche tu, stai inizializzando solo alcuni caratteri. Tutti gli altri personaggi
saranno vuoti.
Quindi quello che succederà qui è che il compilatore inizializzerà i primi cinque elementi.
Str zero a str quattro, tutti quei
caratteri di stringa costante e quindi stringa sub 5 conterranno
il carattere nullo.
Lo spazio verrà ancora allocato per tutti i
40 elementi dell'array, ma verranno utilizzati solo cinque di questi, quattro più il carattere null.
Quindi, ancora una volta, la tua migliore pratica non specifica un numero all'interno della
dimensione, ma assegna semplicemente una stringa letterale usando le virgolette doppie.
Questo è quello che finirai per vedere.
Ora, se non hai inizializzato e hai appena creato
l'array di caratteri con una dimensione, come ci metti la data.
Bene, poiché è un array, non puoi semplicemente assegnare dati.
Sappiamo che se avessimo un array intero, non possiamo
semplicemente assegnare un array intero il numero cinque,
non ha senso. Devi specificare gli elementi effettivi.
Devi specificare gli indici.
Quindi non puoi fare qualcosa come dichiarare un array di caratteri con 100 caratteri e poi dire
s è uguale a ciao. Non funzionerà.
Perché, ancora una volta, s è un array. Anche se è una stringa racchiusa tra virgolette doppie, è ancora un array in memoria.
Quindi, se stai eseguendo un'operazione di assegnazione, non puoi assegnare un
array di caratteri a un altro array di caratteri come sopra.
Se vuoi assegnare dati a un
array di caratteri dopo averlo dichiarato e dopo averlo inizializzato, devi
usare una funzione speciale chiamata str copy.
E ne parleremo in un'altra conferenza.
Quindi fino a questo punto, quando crei le tue stringhe, saranno stringhe letterali,
saranno racchiuse tra virgolette doppie e non le modificherai mai.
Quindi anche questo è perfettamente valido. Si potrebbe effettivamente accedere a
questi caratteri oa ciascun elemento dell'array tramite l'indice e specificare ogni carattere.
Quindi s sotto 0, s sotto 1 e poi metti un singolo carattere tra virgolette singole.
Potresti assegnarlo in questo modo. Ma immagina se avessi una stringa di 100 byte.
Questo richiederà molte righe di codice. Quindi non vuoi farlo.
Quello che vorrai fare è inizializzarlo quando lo
dichiari senza dimensione e quindi specificare se
vuoi modificarlo lo str copi.
Per quanto riguarda la visualizzazione di una stringa come output, useremo ancora quella funzione printf.
Quando si desidera fare riferimento a una stringa in qualsiasi punto del programma, è sufficiente
utilizzare il nome dell'array da solo.
Non è necessario specificare gli indici.
Perché gli indici all'interno dell'array specificheranno un singolo carattere.
Se vuoi l'intera stringa, usa semplicemente il nome dell'array.
Quindi, se stai usando la funzione printf per visualizzare l'output,
dovresti semplicemente fare quanto segue. All'interno delle virgolette, useresti
una percentuale come identificatore di formato e quindi solo il nome della matrice di caratteri.
Quindi non lo tratti come gli altri array quando vuoi accedervi. Quando si desidera accedervi, basta inserire il
nome senza indici o parentesi.
E la percentuale come identificatore di formato serve per l'output di
una stringa terminata da null. Ricorda che prima di usare la percentuale d per
i numeri interi, puoi usare la percentuale c per i caratteri.
Per le stringhe, usi le percentuali e quelle sono matrici di caratteri.
Si aspetta una stringa con terminazione null.
Quindi, tuttavia, si inizializza la stringa se l'hai fatto senza dimensione e viene
aggiunto automaticamente un terminatore nullo o
se l'hai creata con una dimensione specifica e l'hai aggiunta o se
l'hai aggiunta esplicitamente, non importa. Deve solo essere terminato con null.
La funzione printf presume che si incontri l'identificatore di formato percentuale s
che l'argomento corrispondente è una stringa di caratteri terminata da un carattere nullo.
È quello che si aspetta, quindi deve essere così.
Per inserire una stringa, sappiamo come inserire
altri set di dati tramite la tastiera utilizzando scanf.
Faremo la stessa cosa per inserire le stringhe.
Useremo una funzione scanf. Con la funzione scanf, sarà
allo stesso modo, tranne per il fatto che utilizzerai un identificatore di formato diverso.
Quindi, per le stringhe, utilizzerai una percentuale s come input.
E viene utilizzato per inserire una stringa.
L'altra cosa da notare qui è che non c'è una e commerciale per il nome
della variabile perché è un carattere. Ricorda, abbiamo detto che devi
solo fornire la e commerciale l'indirizzo dell'operatore sulle stringhe.
Il motivo è che quando parliamo di indicatori sarà più chiaro.
Ma l'input char anche se è un array
di caratteri è un puntatore e scanf come secondo argomento accetta un puntatore.
Ed è per questo che non devi farlo. Quando dichiari numeri interi e doppi, quelli non
sono puntatori e. Quindi, se
vuoi leggere l'input dalla tastiera usando scanf, il secondo argomento si aspetta un puntatore
che devi passare in un indirizzo.
Ora con scanf quando fai
una stringa, scanf leggerà solo fino allo spazio.
Quindi se fai scanf e digiti Jason
è un istruttore.
L'unica cosa che verrà memorizzata in input è Jason. Perché una volta che colpisce
quello spazio, non leggerà il resto della stringa.
Quindi ci sono altre funzioni che puoi usare per leggere l'intera stringa.
Alcuni degli esempi che utilizzeremo probabilmente lo faranno. Puoi fare cose come f get s,
che è un altro modo per leggere l'input dalla tastiera e che leggerà l'intera
stringa indipendentemente dagli spazi.
Ma ce n'è un altro che penso si
chiami get underscore s per C11,
ma ne parleremo di più, ma questa è solo una cosa
da ricordare quando leggi l'input per le stringhe. Leggerà solo fino allo spazio.
Che ne dici di testare se due stringhe sono uguali.
Bene, fino a questo punto, abbiamo testato tutte
le variabili per vedere se sono uguali, usiamo solo uguale a uguale.
Ma con le stringhe, questo non funzionerà.
L'operatore di uguaglianza, ricorda, abbiamo detto che le stringhe sono matrici di caratteri, quindi non puoi usare operatori su di esse.
E l'operatore di uguaglianza può essere applicato solo a interi e
doppi o float o caratteri.
Non funziona su strutture o array. Non puoi confrontare due array.
Quindi non funzionerà con le stringhe. Se vuoi determinare se due stringhe sono
uguali, devi confrontare esplicitamente le due stringhe di caratteri carattere per carattere.
Quindi dovresti guardare ogni elemento nell'indice
dell'array per indice.
Tuttavia, questo è davvero un grosso problema perché sarebbe davvero noioso.
Quindi parleremo di come puoi farlo molto facilmente
usando una funzione di confronto str dalla libreria standard, ma
non puoi usare gli uguali uguali ricordalo.
E ancora, solo come promemoria, l'ho detto un paio di volte voglio dirlo di nuovo,
la costante di stringa x all'interno di virgolette
doppie non è la stessa della costante di carattere x all'interno di virgolette singole.
X all'interno di virgolette singole è un tipo di base, è solo char
o care.
X tra virgolette doppie è un tipo di unità, è un array di tipo char.
X all'interno di virgolette doppie consiste in realtà di due caratteri, la
x e il terminatore nullo, il carattere nullo, quindi tienilo a mente.
Ecco un
esempio di come possiamo creare stringhe
dichiarandole con una dimensione o inizializzandole sulla stessa riga.
Questa è la migliore pratica. Se hai intenzione di utilizzare stringhe letterali,
quello che farei è
fare quello che dice qui, creare l'array di caratteri, non specificare
una dimensione e quindi a destra dell'operatore di assegnazione avere virgolette doppie.
Il compilatore creerà automaticamente la stringa corretta e vi aggiungerà un terminatore nullo.
Se specifichi una dimensione e poi non hai abbastanza caratteri, non la memorizzerà.
Quindi crea solo stringhe di caratteri letterali utilizzando
il tipo di dati char, il
nome della variabile e quindi le parentesi vuote.
Penso che questo programma conterà i caratteri in
un array, quindi essenzialmente otterrà la lunghezza della stringa.
Quello che stiamo facendo qui è creare una variabile denominata count in due array di
caratteri con due stringhe differenti, essere o non essere e
quindi virgola che è la domanda.
Char str uno avrà un alternatore dopo b, e
str avrà un'alternativa dopo la domanda.
Quindi abbiamo un ciclo qui che passerà attraverso il primo
array, da count è uguale a zero fino a quando non vediamo un terminatore nullo.
E possiamo usare il non uguale in questo caso perché stiamo confrontando un personaggio.
Terminatore nullo come carattere. Va benissimo confrontare i personaggi.
Quindi il nostro ciclo while andrà fino in fondo finché non vedremo un terminatore nullo.
Una volta che vediamo un terminatore nullo, salteremo fuori.
Il conteggio sarà uguale al numero di caratteri in quella stringa.
Quindi è la lunghezza di quella stringa.
Lo facciamo per entrambe le corde. E noterai che fondamentalmente entrambe
le stringhe avranno la lunghezza corretta perché le stiamo solo esaminando.
Per b o non per b saranno qualcosa come
18 caratteri.
Ora non avrai mai bisogno di fare nulla di simile perché
abbiamo una bella funzione di aiuto con str length per trovare le lunghezze delle stringhe.
Ma ancora una volta, ciò che sta dimostrando è il fatto che si tratta di un array.
E se vuoi confrontare o trovare la lunghezza di una stringa, puoi usare
il non uguale e guardare il carattere, il terminatore nullo.
Spero che questo sia stato utile. Questo è il modo in cui definiremo e inizializzeremo i letterali stringa.
Grazie.