Ciao e bentornato. Un'altra lezione entusiasmante. In questa lezione
parleremo di più delle stringhe e delle funzioni
delle stringhe, principalmente la capacità di cercare tokenize e analizzare le stringhe.
Quindi discutiamo alcune altre funzioni di stringa. Ricerca di una stringa.
Ricerca di una stringa.
Tutte queste funzioni saranno nell'intestazione della stringa.
Esistono alcune funzioni di ricerca di stringhe che sono particolarmente utili in
cui è possibile trovare un carattere specifico o una sottostringa.
I nomi di queste funzioni sono strchr
e strstr.
Trovare un singolo carattere o sottostringa all'interno di una stringa.
Forniremo alcuni esempi di ciò.
Esistono anche alcune funzionalità per la tokenizzazione di una stringa.
Puoi dire cosa sta tokenizzando una stringa. Per prima cosa, devi definire cos'è un token.
Un token è una sequenza di caratteri all'interno di una stringa delimitata da un delimitatore.
Un delimitatore è qualcosa che si trova nella stringa che
noti che ha un significato speciale.
Quindi un token sarebbe se avessi una stringa completa, questo è
Jason ed è stato separato da spazi.
Un segno potrebbe essere questo, un altro potrebbe essere è, un altro potrebbe essere Jason.
È un modo per prendere un'intera stringa e spezzarla in determinati
limiti in base a un delimitatore.
E vuoi assicurarti che il tuo delimitatore non sia
qualcosa che è valido nella stringa effettiva. Quindi usi anche i delimitatori
quando leggi dai file, lo stesso tipo di concetto.
Quando dividi una frase in parole, si chiama tokenizzazione. Useremo questa funzione
chiamata strtok.
Voglio anche parlare di alcune stringhe di analisi. Ce ne
sono un sacco, molti diversi per verificare se
i caratteri sono caratteri minuscoli o maiuscoli
o alfanumerici o cifre.
Questi vengono eseguiti principalmente sui caratteri, ma i caratteri nelle stringhe laterali
e puoi anche applicarli a intere stringhe.
Ora stiamo entrando in alcuni dettagli in più sulle stringhe.
E per comprendere alcune di queste funzioni, dobbiamo parlare un po 'dei puntatori.
I puntatori sono un concetto enorme in c.
Avremo un'intera sezione dedicata ai puntatori.
Probabilmente, il prossimo o quello dopo.
Ed è un sacco di discussioni. È probabilmente l'argomento più confuso della lingua.
Non voglio parlarne in dettaglio adesso perché non è rilevante.
Voglio solo toccarlo, darti solo un'anteprima di cosa sia un puntatore in modo che
tu possa capire alcune di queste funzioni che useremo.
Questo è l'unico scopo di questo. Quindi, se non comprendi appieno i
suggerimenti a questo punto dopo queste due diapositive, non preoccuparti.
Quindi il concetto di puntatore, ancora una volta, discuteremo in dettaglio più avanti.
Ma per capire alcune di queste funzioni di stringa, voglio darti una rapida occhiata.
Il C fornisce un tipo di variabile molto utile, chiamato puntatore.
Ne ho parlato. Ha a che fare con la memoria e l'allocazione della memoria.
Alcuni linguaggi se hai già programmato e non
sei del tutto nuovo alla programmazione, alcuni linguaggi gestiranno automaticamente la memoria per te.
Assegneranno memoria per te e la cancelleranno, linguaggio come Java fa questo.
Si chiama garbage collector. Un linguaggio come il c non lo fa.
Quindi, ogni volta che crei memoria per usare
i puntatori, devi cancellare quella memoria.
Ma cos'è un puntatore è molto utile
e cos'è è una variabile che memorizza un indirizzo.
Un indirizzo, ricorda, è qualcosa nella memoria.
Di solito è esadecimale.
Il valore nell'indirizzo si trova in un'altra posizione nella memoria.
Il puntatore punta semplicemente a un indirizzo che l'indirizzo contiene un valore.
E abbiamo effettivamente utilizzato indirizzi in passato con la funzione scanf.
Ricorda, quel simbolo e commerciale che abbiamo usato è l'indirizzo dell'operatore.
La funzione Scanf come secondo parametro dovrebbe
contenere una variabile di cui si desidera memorizzare
i dati, quella variabile deve essere un puntatore.
E così la funzione scanf si aspettava un puntatore.
Per creare un numero intero da solo, non è un
puntatore, ma se ne ottieni l'indirizzo, ora diventa un puntatore.
Quindi stiamo usando la e commerciale per ottenere l'indirizzo di un tipo di dati primitivo.
Quindi hai un po 'di familiarità con il concetto di indirizzo.
Ricorda, da ora con i puntatori, crei un
numero int e quello non è un
puntatore ed è uguale a 25.
Ma se ottieni la e commerciale di esso, che è l'indirizzo di esso, puoi quindi assegnarlo a un puntatore.
Un puntatore ha una sintassi speciale in c, l'asterisco rappresenta un puntatore.
Quindi abbiamo dichiarato un numero variabile con il valore 25 e
poi abbiamo dichiarato un puntatore utilizzando l'asterisco denominato pNumber,
che contiene l'indirizzo del numero.
E ancora, l'asterisco viene utilizzato per dichiarare il puntatore, è così che sai che
è un tipo di dati del puntatore.
Per ottenere il valore della variabile numero p perché
il numero p è cosa? È un puntatore che punta a un indirizzo in memoria.
Se provi solo a guardare il valore del numero p, ti darà l'indirizzo.
Se vuoi ottenere il valore di ciò a cui punta l'indirizzo, devi de-referenziarlo.
Quindi c'è una sintassi
speciale che c usa si chiama asterisco e nome della variabile, è così che
puoi effettivamente accedere alla posizione di memoria che contiene il valore.
Quindi, se vuoi assegnare i dati a quella posizione di memoria, devi dire il numero della stella p.
Anche in questo caso l'effetto è che accede ai dati memorizzati all'indirizzo specificato dal puntatore.
Quindi diventa molto confuso quando parliamo di indicatori perché non sei abituato a questo concetto.
Pensi che una variabile abbia un valore, questo è tutto. Ma una variabile può avere un indirizzo e
l'indirizzo può quindi avere un valore.
Questa diapositiva cerca di illustrare ciò che ho appena menzionato.
L'ho trovato in un libro che ho letto.
È una diapositiva che mostra il concetto di un puntatore in memoria e
come funzionano le cose con gli indirizzi.
Quindi sto in un certo senso ribadendo ciò che ho appena menzionato.
Ma il valore della e commerciale numero è l'indirizzo in cui si trova il numero.
Quindi se hai due variabili, numero ep numero,
p numero è un puntatore, numero è un int,
a proposito, devi anche specificare il tipo di puntatore.
Anche se il puntatore è
un indirizzo, si specifica comunque il tipo o dove punta l'indirizzo.
Quindi int star p number sarà uguale all'indirizzo del numero.
Il numero è in memoria e, ad esempio,
punta a un indirizzo di mille e ha un valore di 25.
Il numero P ha un indirizzo di 105
per quel numero p effettivo, ma
il valore di quell'indirizzo è 1000 indirizzo.
Per ottenere il valore del numero p, dovresti dereferenziare 1000, che ti
darà 25.
Il motivo per cui ho menzionato tutta questa
cosa sui puntatori perché molte funzioni di stringa restituiranno puntatori.
Non importerà poi così tanto.
È importante solo quando vuoi capire come ottenere un certo carattere all'interno di un array.
Ma volevo menzionarli brevemente.
Va bene se il concetto non affonda in questo momento perché lo tratteremo in un
sacco di dettagli in una sezione successiva.
Ma capisci che le funzioni di stringa che ora useremo restituiranno puntatori e
quindi forse userai quel ritorno per fare qualcosa di utile.
In passato, quando usavamo le copie str e il confronto str,
passavamo dei puntatori ma non restituivano mai puntatori, non dovevamo mai usare quel puntatore.
Ora che dobbiamo usare il puntatore, voglio solo dare una piccola descrizione di cosa significa.
Il puntatore punta solo a un indirizzo.
E poi puoi usare quell'indirizzo per eseguire l'analisi o qualsiasi altra cosa tu abbia bisogno di fare.
Quindi, si spera, questo non ti ha sopraffatto. Ancora una volta, non preoccuparti se non lo capisci completamente.
Esamineremo ora alcuni esempi
di analisi, tokenizzazione e ricerca di stringhe.
Per cercare una stringa, abbiamo detto, utilizzerai strchr o strstr.
Lo strchr ricerca una data stringa per un singolo carattere.
Il primo argomento della funzione è la stringa da cercare,
che sarà l'indirizzo di un array di caratteri.
Il secondo argomento è il personaggio che stai cercando.
Forniremo un esempio tra un secondo. Quindi la funzione cercherà la
stringa iniziando dall'inizio e restituirà un
puntatore alla prima posizione nella stringa in cui si trova il carattere.
Questo è il motivo per cui il puntatore è importante
ora perché non stiamo restituendo un intero valore, stiamo restituendo un
puntatore a un carattere
all'interno di una stringa e quell'indirizzo rappresenta essenzialmente l'indice di un array.
Quindi l'indirizzo di questa posizione in memoria, è un carattere di tipo stella ed è
descritto come un puntatore a
un carattere, che in realtà è solo un singolo carattere in memoria.
Per memorizzare il valore restituito, è necessario creare una variabile che possa memorizzare l'indirizzo di un carattere,
quindi è necessario creare un puntatore.
Se il carattere viene ora trovato, la funzione restituisce un valore speciale, che è nullo.
Null significa che il puntatore non punta a nulla.
Usiamo null quando parliamo di puntatori e null sta solo
dicendo che non ha trovato nulla. Quindi non punta a nulla.
Quando punta a qualcosa, punta all'indirizzo in cui hai trovato quel carattere e
quindi puoi iniziare ad analizzare da lì.
Perché ricorda dalle lezioni precedenti,
quando crei un array di caratteri in
memoria, hai semplicemente ogni carattere rappresentato come un byte.
E se stai analizzando una
stringa e vuoi vedere dove inizia un particolare carattere in quella stringa,
restituisci quel byte e poi puoi iniziare a cercare da lì.
Quindi str char, come lo usi è questo.
Dici di creare una stringa di caratteri e la
inizializziamo qui con una rapida volpe marrone.
Creiamo quindi un singolo carattere e lo inizializziamo con q.
Quindi creiamo un puntatore perché dobbiamo creare un puntatore perché è ciò che viene restituito dal carattere str, questo è ciò
che ci permette di vedere dove in quella stringa abbiamo trovato un carattere.
Inizializzeremo il nostro puntatore a null. Perché in questo momento non indicherà nulla.
Quindi chiameremo str char, passeremo nella nostra stringa che è la rapida volpe marrone, e passeremo
nel nostro singolo carattere che è q.
Quello che succederà è guardare dentro la rapida volpe marrone.
E la prima volta che trova una q, restituirà l'indirizzo di quella q.
Quindi p got
char punta davvero al quarto indice di str.
Perché t è sotto zero, h è sotto uno, e è sotto due,
lo spazio è sotto tre, q è sotto quattro.
Quindi p got char indicherà q nella rapida volpe marrone.
E così puoi vedere esattamente dove inizia quel carattere in quella stringa.
Quindi il primo argomento di str char è l'indirizzo della prima posizione in cui cercare, questa è
la stringa di ricerca.
Il secondo argomento è il carattere che si cerca, il carattere che si vuole cercare,
un singolo carattere.
Si aspetta che il secondo argomento sia di tipo int.
Quindi tecnicamente str char, il secondo argomento accetta.
Ma il compilatore c convertirà automaticamente il grafico in un int.
Otterrà il valore ASCII, essenzialmente.
Quindi potresti effettivamente definire il carattere q
singolo invece di un singolo carattere, potresti definirlo come un int.
Questo è solo più un tecnicismo che volevo farti conoscere.
Ma p got char indicherà il valore quick brown
fox perché inizierà da q e poi andrà al terminatore nullo se provi a stamparlo.
Quindi in realtà sarà una volpe marrone veloce quando esegui questo esempio.
È così che puoi cercare un singolo carattere in un'intera stringa.
Usa str char quindi usa il puntatore e quindi visualizza il puntatore.
E come visualizzi quel puntatore? Nello stesso modo in cui visualizzi altri caratteri, usa printf, percent s.
Quindi questo è un bel meccanismo per cercare caratteri in un'intera stringa.
Se vuoi cercare una stringa all'interno di una stringa, che sarebbe una
sottostringa, usa strstr.
Questa è probabilmente la più utile di tutte le funzioni di ricerca.
Cerca in una stringa l'occorrenza di una sottostringa.
E restituisce un puntatore alla posizione nella prima stringa in cui si trova la
sottostringa, molto simile a str char, ma cerca un'intera stringa. Se non trova alcuna corrispondenza, restituisce null.
Il primo argomento è la stringa che deve essere ricercata proprio come str char.
La seconda è la sottostringa che stai cercando, un'altra stringa. Quindi ecco un esempio.
Sembra molto simile all'altro tranne che invece di cercare un
singolo carattere, stiamo cercando una parola, una stringa.
Quindi abbiamo la parola, che è uguale a cane.
E abbiamo un testo che dice che ogni cane ha la sua giornata.
Creiamo di nuovo il nostro puntatore perché deve essere: questo è ciò che restituisce la funzione.
Quando chiamiamo strstr, passiamo nel testo la stringa che vogliamo guardare.
E poi il secondo argomento è la parola che vogliamo guardare all'interno di quella stringa.
Quindi cercherà il testo la prima occorrenza della stringa memorizzata nella parola.
Il cane stringa appare al settimo carattere nel testo.
Se guardi il testo.
Il testo sub 6 sarà uguale a cane, è lì che inizia.
Quindi il puntatore punterà all'indirizzo del testo più 6 dog, e
inizierà da lì, e poi andrà al terminatore nullo.
Quindi p trovato sta per essere il cane ha la sua giornata.
Inoltre, fai attenzione perché la ricerca fa distinzione tra maiuscole e minuscole.
Se hai effettivamente fornito una D-O-G maiuscola, non troverai nulla,
cercherà solo il caso corretto.
Ma questo è usato per trovare sottostringhe e stringhe, molto utile
perché molte volte in un programma dirai che questa stringa è all'interno di
questa stringa perché è quasi simile a grep se hai mai usato grep su Linux.
Spero che questo abbia un senso. Tokenizzare una stringa.
Un token è una sequenza di caratteri uno di loro stringa che è delimitato da un delimitatore, lo sappiamo.
Un delimitatore può essere qualsiasi cosa, ma dovrebbe essere qualcosa di unico per quella stringa.
Non avere un delimitatore come "A" perché ora troverà in quella stringa
qualcosa di valido in una parola.
Rendilo qualcosa di unico come uno spazio o una virgola. Questo, ancora una volta, viene utilizzato come confine per
le parole di solito in una singola stringa.
Quindi spezza una frase in parole, si chiama tokenizzazione.
Questa funzione strtok viene utilizzata per tokenizzare una stringa.
Richiede due argomenti.
La stringa da tokenizzare, che è l'intera stringa che ha gli spazi e ha i delimitatori.
E poi la stringa contenente tutti i caratteri limitati positivi.
È possibile specificare ciò che si desidera impostare come confine.
Quindi ecco un esempio.
Stiamo creando una matrice di caratteri 80.
Dice ciao, come stai, sei un trattino, il mio nome è un trattino Jason.
Creiamo quindi una stringa costante che rappresenta il delimitatore, che
è il meno, il trattino. Sembra un po 'diverso, ma è ancora il meno, il
trattino, sono entrambi trattini.
E poi creiamo il nostro puntatore che è token.
Perché strtok restituirà ogni
nostro gettone.
Quindi se chiamiamo il nostro strtok e passiamo una
stringa e passiamo i nostri delimitatori
s, il token sarà uguale alla prima cosa che trova.
Quindi la prima volta che chiami strtok, sarà uguale a ciao come
stai spazio e poi trova la corrispondenza con il trattino.
E se chiami per la
seconda volta, verrà stampato il mio nome è.
Se lo chiami una terza
volta, stamperà Jason perché sta passando attraverso i trattini.
Ecco perché abbiamo un ciclo while qui. Diciamo che mentre il token non è uguale a
null, stampa il token.
E poi otteniamo il gettone successivo chiamando strtok.
E diciamo null come primo parametro es è
il nostro secondo parametro e
poi noi, visualizziamo. Quindi diamo un'occhiata a
questo nei blocchi di codice poiché lo renderà più comprensibile.
Quindi costruiamolo. Abbiamo appena esaminato questo esempio.
Voglio mostrarti qual è l'output, quindi è chiaro cosa sta succedendo qui.
Quindi qui vedrai che dice che stampa il
primo token che è ciao come stai.
Bene, la prima cosa che fa è
che trova il primo token, lo stampa, ciao come stai, il mio nome è e poi Jason.
Quindi ora abbiamo ciao come stai, trova
il primo trattino, lo stampa. Il mio nome è trova il gettone successivo,
quindi il terzo è Jason. Ma devi chiamare il token
tre volte per ottenere ogni token.
Il primo tokenizzerà su str.
Guarda il prossimo che puoi passare in null perché non vuoi guardare di nuovo, vuoi solo ottenere il prossimo token.
E così passi un nullo il secondo e passi solo una s.
Ti darà il gettone successivo del gettone str già.
Quindi è così che puoi usare strtok. Aiuta molto con l'analisi.
Puoi analizzare qualcosa e ottenere determinati limiti.
Le ultime funzioni di cui voglio parlare sono queste funzioni di analisi delle stringhe.
Ce ne sono un sacco, quindi ho appena fornito un tavolino qui.
È inferiore, è superiore. Fa esattamente quello che pensi che farebbe.
Verifica se un carattere è minuscolo o maiuscolo.
Stiamo testando alcuni caratteri, ma sono usati all'interno di stringhe.
E quindi l'argomento di ciascuna di queste funzioni è il carattere che vuoi cercare.
E poi tutte queste funzioni restituiscono un valore diverso da zero
di tipo int se il carattere è all'interno del set che viene testato.
Quindi passeremo caratteri int all'interno alla ricerca di parole interne.
Se abbiamo una lettera maiuscola all'interno di una parola, ce lo dirà e
possiamo usarla anche per analizzare i singoli elementi in modo carattere.
Quindi i valori restituiti verranno convertiti in vero o falso in modo
da poterli utilizzare anche come booleani, il che è carino.
Quindi è inferiore restituirà vero se
una parola o un carattere ha una lettera minuscola.
Bene, ecco un bell'esempio che volevo
esaminare, che conterà il numero di cifre delle lettere in un'intera stringa.
Quindi eseguiamolo perché sarà chiaro, ma quello
che dovresti notare è che stiamo creando un buffer, il
nostro buffer di input e quindi stiamo creando tre numeri interi da contare.
Chiediamo all'utente di inserire una stringa
di meno di tanti caratteri, quindi la leggiamo.
Quindi esamineremo quella stringa per vedere
se contiene determinati caratteri.
E quindi itereremo su quella stringa
guardando ogni indice nell'array.
Quindi ecco il nostro esempio.
Ancora una volta, il buffer è il nostro array
di caratteri che memorizzerà gli input. Useremo scanf per popolarlo.
Dobbiamo digitare la nostra stringa senza spazi, è una singola stringa.
Lo esamineremo, esamineremo ogni elemento nel buffer e quindi chiameremo le funzioni is
alpha, is digit o is punct per vedere se quei caratteri
sono lì, e quindi aumenterà in
base a quello, indipendentemente dal fatto che quello restituisce vero o falso e quindi mostrerà
quante lettere, cifre e caratteri di punteggiatura si trovano all'interno di quella stringa.
Facciamo questo.
Vado solo a inserire qualcosa con un mucchio di lettere
maiuscole, forse alcune cifre.
Quindi quando premo Invio, conterà tutto. Quindi dice che
la mia guida conteneva 24 lettere, 4 cifre e 1
carattere di punteggiatura, i due punti.
Simpatico programmino che utilizza queste funzioni di carattere ma
è utile quando si analizza una stringa perché è quello
che stai facendo, stai analizzando la stringa, ma stai
solo attraversando carattere per carattere. Grazie.