Bonjour et bienvenue à nouveau. Une autre conférence passionnante. Dans cette conférence, nous
allons parler davantage des chaînes et des fonctions
de chaîne, principalement la possibilité de rechercher des jetons et d'analyser des chaînes.
Parlons donc de quelques fonctions de chaîne supplémentaires. Recherche d'une chaîne.
Recherche d'une chaîne.
Toutes ces fonctions vont être dans l'en-tête de chaîne.
Il existe des fonctions de recherche de chaînes particulièrement utilisées où
vous pouvez trouver un caractère spécifique ou une sous-chaîne.
Le nom de ces fonctions est strchr
et strstr.
Recherche d'un seul caractère ou d'une sous-chaîne à l'intérieur d'une chaîne.
Nous en donnerons quelques exemples.
Il existe également des fonctionnalités pour tokeniser une chaîne.
Vous pouvez dire ce qui symbolise une chaîne. Tout d'abord, vous devez définir ce qu'est un jeton.
Un jeton est une séquence de caractères dans une chaîne délimitée par un délimiteur.
Un délimiteur est quelque chose qui se trouve dans la chaîne que vous
remarquez et qui a une signification particulière.
Donc, un jeton serait si vous aviez une chaîne complète, c'est
Jason et il était séparé par des espaces.
Un jeton pourrait être ceci, un autre pourrait être, un autre pourrait être Jason.
C'est une façon de prendre une chaîne entière et de la séparer
dans certaines limites en fonction d'un délimiteur.
Et vous voulez vous assurer que votre délimiteur n'est pas quelque
chose qui est valide dans la chaîne réelle. Vous utilisez donc également des délimiteurs
lorsque vous lisez des fichiers, même type de concept.
Lorsque vous divisez une phrase en mots, cela s'appelle la création de jetons. Nous allons utiliser cette
fonction appelée strtok.
Je veux également parler de quelques chaînes d'analyse. Il y en
a une tonne, beaucoup de différents pour vérifier si les
caractères sont des caractères minuscules ou des caractères majuscules
ou alphanumériques ou des chiffres.
Celles-ci sont principalement effectuées sur des caractères, mais des caractères dans des chaînes latérales et
vous pouvez également les appliquer à des chaînes entières.
Nous entrons maintenant dans plus de détails sur les chaînes.
Et pour comprendre certaines de ces fonctions, nous devons parler un peu des pointeurs.
Les pointeurs sont un énorme concept en c.
Nous allons avoir une section entière consacrée aux pointeurs.
Probablement le suivant ou le suivant.
Et c'est beaucoup de discussions. C'est probablement le sujet le plus déroutant de la langue.
Je ne veux pas revenir là-dessus en détail pour le moment, car ce n'est pas pertinent.
Je veux seulement en parler, juste vous donner un petit aperçu de ce qu'est un pointeur afin
que vous puissiez comprendre certaines de ces fonctions que nous allons utiliser.
C'est le seul but de cela. Donc, si vous ne comprenez pas complètement les
pointeurs à ce stade après ces deux diapositives, ne vous inquiétez pas.
Donc, le concept de pointeur, encore une fois, nous allons discuter en détail plus tard.
Mais afin de comprendre certaines de ces fonctions de chaîne, je veux vous donner un aperçu rapide.
C fournit un type de variable utile remarquable, c'est ce qu'on appelle un pointeur.
J'en ai parlé. Cela a à voir avec la mémoire et l'allocation de mémoire.
Certaines langues si vous avez déjà programmé et que
vous n'êtes pas entièrement novice en programmation, certaines langues géreront automatiquement la mémoire pour vous.
Ils alloueront de la mémoire pour vous et la supprimeront, un langage comme java le fait.
C'est ce qu'on appelle le ramasse-miettes. Un langage comme c ne fait pas cela.
Ainsi, chaque fois que vous créez de la mémoire pour utiliser
des pointeurs, vous devez supprimer cette mémoire.
Mais ce qu'est un pointeur, c'est très utile
et ce que c'est, c'est une variable qui stocke une adresse.
Une adresse, rappelez-vous, est quelque chose en mémoire.
C'est généralement hexadécimal.
La valeur de l'adresse se trouve à un autre emplacement de la mémoire.
Le pointeur pointe simplement vers une adresse dont l'adresse contient une valeur.
Et nous avons en fait utilisé des adresses dans le passé avec la fonction scanf.
N'oubliez pas que ce symbole esperluette que nous avons utilisé est l'adresse de l'opérateur.
La fonction Scanf comme deuxième paramètre
devrait prendre une variable que vous vouliez stocker
les données, cette variable doit être un pointeur.
Et donc la fonction scanf attendait un pointeur.
Pour créer un entier par lui-même, ce n'est pas un pointeur,
mais si vous en obtenez l'adresse, il devient maintenant un pointeur.
Nous utilisons donc l'esperluette pour obtenir l'adresse d'un type de données primitif.
Vous connaissez donc un peu le concept d'adresse.
Rappelez-vous, à partir de maintenant avec les pointeurs, vous
créez un nombre entier et ce n'est pas un
pointeur et il est égal à 25.
Mais si vous en obtenez l'esperluette, qui en est l'adresse, vous pouvez alors l'attribuer à un pointeur.
Un pointeur a une syntaxe spéciale en c, l'astérisque représente un pointeur.
Nous avons donc déclaré un nombre variable avec la valeur 25 puis
nous avons déclaré un pointeur en utilisant l'astérisque nommé
pNumber, qui contient l'adresse du nombre.
Et encore une fois, l'astérisque est utilisé pour déclarer le pointeur, c'est ainsi que vous
savez qu'il s'agit d'un type de données pointeur.
Pour obtenir la valeur de la variable p nombre parce
que p nombre est quoi? C'est un pointeur qui pointe vers une adresse en mémoire.
Si vous essayez simplement de regarder la valeur du nombre p, cela vous donnera l'adresse.
Si vous voulez obtenir la valeur de ce que pointe l'adresse, vous devez la dé-référencer.
Il y a donc
une syntaxe spéciale que c utilise, elle s'appelle l'astérisque et le nom de la variable,
c'est ainsi que vous pouvez accéder à l'emplacement mémoire qui contient la valeur.
Donc, si vous voulez attribuer des données à cet emplacement de mémoire, vous devez dire le numéro étoile p.
Encore une fois, l'effet est qu'il accède aux données stockées à l'adresse spécifiée par le pointeur.
Cela devient donc très déroutant lorsque nous parlons de pointeurs car vous n'êtes pas habitué à ce concept.
Vous pensez qu'une variable a une valeur, c'est tout. Mais une variable peut avoir une adresse et
l'adresse peut alors avoir une valeur.
Cette diapositive tente d'illustrer ce que je viens de mentionner.
J'ai trouvé cela dans un livre que j'ai lu.
C'est une diapositive qui vous montre le concept d'un pointeur en mémoire et
comment les choses fonctionnent avec les adresses.
Je réitère donc en quelque sorte ce que je viens de mentionner.
Mais la valeur de l'esperluette est l'adresse où se trouve le numéro.
Donc, si vous avez deux variables, number et p
number, p number est un pointeur, number est un int,
vous devez aussi, en passant, spécifier le type du pointeur.
Même si le pointeur est
une adresse, vous spécifiez toujours le type ou l'endroit où l'adresse pointe.
Donc, int star p number va être égal à l'adresse du nombre.
Le nombre est en mémoire, il pointe vers une
adresse de mille par exemple et il a une valeur de 25.
Le numéro P a une adresse de 105
pour ce nombre p réel, mais
la valeur de cette adresse est 1000 adresse.
Afin d'obtenir la valeur du nombre p, vous devez déréférencer le 1000, ce qui
vous donnera 25.
La raison pour laquelle je mentionne tout cela à propos des
pointeurs parce que beaucoup de fonctions de chaîne vont renvoyer des pointeurs.
Cela n'aura pas vraiment d'importance.
Ce n'est important que lorsque vous voulez comprendre comment vous obtenez un certain caractère à l'intérieur d'un tableau.
Mais je voulais les mentionner brièvement.
Ce n'est pas grave si le concept ne s'imprègne pas en ce moment, car nous allons le couvrir
dans une tonne de détails dans une section ultérieure.
Mais comprenez que les fonctions de chaîne que nous allons maintenant utiliser vont renvoyer des pointeurs
et que vous allez peut-être utiliser ce retour pour faire quelque chose d'utile.
Dans le passé, lorsque nous utilisions les copies str et la str compare, nous
passions des pointeurs mais cela ne renvoyait jamais de pointeurs, nous n'avions jamais besoin d'utiliser ce pointeur.
Maintenant que nous devons utiliser le pointeur, je veux simplement donner une petite description de ce que cela signifie.
Le pointeur va juste pointer vers une adresse.
Et puis vous pouvez utiliser cette adresse pour faire l'analyse ou tout ce que vous devez faire.
J'espère donc que cela ne vous a pas submergé. Encore une fois, ne vous inquiétez pas si vous ne le comprenez pas complètement.
Nous allons maintenant passer en revue
quelques exemples d'analyse, de tokenisation et de recherche de chaînes.
Pour rechercher une chaîne, nous l'avons mentionné, vous allez utiliser le strchr ou le strstr.
Le strchr recherche une chaîne donnée pour un seul caractère.
Le premier argument de la fonction est la chaîne à
rechercher, qui sera l'adresse d'un tableau de caractères.
Le deuxième argument est le personnage que vous recherchez.
Nous vous donnerons un exemple dans une seconde. La fonction va donc rechercher la
chaîne en commençant au début et renvoyer
un pointeur vers la première position de la chaîne où se trouve le caractère.
C'est pourquoi le pointeur est important maintenant car nous
ne renvoyons pas une valeur entière, nous renvoyons un pointeur
vers un caractère à
l'intérieur d'une chaîne et cette adresse représente essentiellement l'index d'un tableau.
Donc, l'adresse de cette position en mémoire, c'est une étoile de caractère de type et
elle est décrite comme un pointeur
vers un caractère, qui n'est en réalité qu'un seul caractère en mémoire.
Pour stocker la valeur renvoyée, vous devez créer une variable capable de stocker l'adresse d'un caractère,
vous devez donc créer un pointeur.
Si le caractère est maintenant trouvé, la fonction renvoie une valeur spéciale, qui est nulle.
Null signifie que le pointeur ne pointe vers rien.
Nous utilisons null lorsque nous parlons de pointeurs, et null
signifie simplement qu'il n'a rien trouvé. Donc ça ne veut rien dire.
Lorsqu'il pointe vers quelque chose, il pointe vers l'adresse de l'endroit où vous avez trouvé ce caractère et
vous pouvez alors commencer l'analyse à partir de là.
Parce que rappelez-vous des conférences
précédentes, lorsque vous créez un tableau de caractères
en mémoire, chaque caractère est simplement représenté sous forme d'octet.
Et si vous analysez une chaîne
et que vous voulez voir où un caractère particulier commence dans cette chaîne, vous renvoyez
cet octet et vous pouvez alors commencer à chercher à partir de là.
Alors str char, comment vous l'utilisez est la suivante.
Vous dites que vous créez une chaîne de caractères et
nous l'initialisons ici avec un renard brun rapide.
On crée ensuite un seul caractère et on l'initialise avec q.
Ensuite, nous créons un pointeur car nous devons créer un pointeur car c'est ce qui est renvoyé par le caractère str, c'est ce
qui nous permet de voir où dans cette chaîne nous avons trouvé un caractère.
Nous allons initialiser notre pointeur sur null. Parce que pour le moment, cela n'indiquera rien.
Ensuite, nous allons appeler str char, nous allons passer dans notre chaîne qui est le renard brun rapide, et nous
allons passer dans notre caractère unique qui est q.
Ce qui va se passer, c'est qu'il va regarder à l'intérieur du renard brun rapide.
Et la première fois qu'il trouve un q, il retournera l'adresse de ce q.
Donc p got char
va vraiment pointer vers le quatrième index de str.
Parce que t est inférieur à zéro, h est inférieur à un, e est inférieur à
deux, l'espace est inférieur à trois, q est inférieur à quatre.
Donc p got char va pointer vers q chez le renard brun rapide.
Et ainsi vous pouvez voir exactement où ce caractère commence dans cette chaîne.
Ainsi, le premier argument de str char est l'adresse du premier emplacement à rechercher, c'est
la chaîne de recherche.
Le deuxième argument est le caractère recherché, le caractère que vous souhaitez rechercher,
un seul caractère.
Il s'attend à ce que le deuxième argument soit de type int.
Donc, techniquement, str char, le deuxième argument prend en compte.
Mais le compilateur c convertira automatiquement le graphique en un entier.
Il obtiendra essentiellement la valeur ASCII.
Ainsi, vous pouvez définir le caractère unique q
au lieu d'un seul caractère, vous pouvez le définir comme un int.
C'est juste plus une technicité que je voulais que vous sachiez.
Mais p got char va pointer vers la valeur quick brown fox
car il va commencer à q et ensuite il ira au terminateur nul si vous essayez de l'imprimer.
Donc, ce sera en fait un renard brun rapide lorsque vous exécuterez cet exemple.
C'est ainsi que vous pouvez rechercher un seul caractère dans une chaîne entière.
Utilisez str char puis utilisez le pointeur, puis affichez le pointeur.
Et comment affichez-vous ce pointeur? De la même manière que vous affichez les autres caractères, utilisez printf, percent s.
C'est donc un bon mécanisme pour rechercher des caractères dans une chaîne entière.
Si vous souhaitez rechercher une chaîne à l'intérieur d'une chaîne, qui serait une
sous-chaîne, vous utilisez strstr.
C'est probablement la plus utile de toutes les fonctions de recherche.
Il recherche une chaîne pour l'occurrence d'une sous-chaîne.
Et il renvoie un pointeur vers la position dans la première chaîne où la sous-chaîne est
trouvée, très similaire à str char, mais il recherche une chaîne entière. S'il n'a trouvé aucune correspondance, il renvoie null.
Le premier argument est la chaîne à rechercher, tout comme str char.
La deuxième est la sous-chaîne que vous recherchez, une autre chaîne. Voici donc un exemple.
Il ressemble beaucoup à l'autre sauf qu'au lieu de chercher un
seul caractère, nous cherchons un mot, une chaîne.
Nous avons donc mot, qui est égal à chien.
Et nous avons un texte qui est que chaque chien a sa journée.
Nous créons à nouveau notre pointeur car il doit l'être - c'est ce que la fonction renvoie.
Lorsque nous appelons strstr, nous passons dans le texte la chaîne que nous voulons regarder.
Et puis le deuxième argument est le mot que nous voulons regarder à l'intérieur de cette chaîne.
Il va donc rechercher le texte de la première occurrence de la chaîne stockée dans word.
Le chien de chaîne apparaît au septième caractère dans le texte.
Si vous regardez du texte.
Le texte sub 6 va être égal à dog, c'est là que ça commence.
Ainsi, le pointeur va pointer vers l'adresse du texte plus 6 dog, et
il va commencer là, puis il ira au terminateur nul.
Donc p trouvé va être chien a son jour.
Et soyez également prudent car la recherche est sensible à la casse.
Si vous avez effectivement fourni un D-O-G majuscule, vous ne trouverez rien,
il ne cherchera que la casse correcte.
Mais cela est utilisé pour trouver des sous-chaînes et des chaînes, très utile
car souvent dans un programme, vous allez dire que cette chaîne est à l'intérieur de
cette chaîne parce que c'est presque similaire à un grep si vous avez déjà utilisé grep sous Linux.
J'espère que cela a du sens. Tokenizing une chaîne.
Un jeton est une séquence de caractères dont une chaîne qui est liée par un délimiteur, nous le savons.
Un délimiteur peut être n'importe quoi, mais il doit être quelque chose d'unique à cette chaîne.
Ne pas avoir de délimiteur comme "A" car maintenant il va trouver dans cette chaîne
quelque chose de valide dans un mot.
Faites-en quelque chose d'unique comme un espace ou une virgule. Ceci, encore une fois, est utilisé comme une limite
pour les mots généralement dans une seule chaîne.
Donc, ça casse une phrase en mots, ça s'appelle tokenizing.
Cette fonction strtok est utilisée pour tokeniser une chaîne.
Cela nécessite deux arguments.
La chaîne à tokeniser, qui est la chaîne entière contenant les espaces et les délimiteurs.
Et puis la chaîne contenant tous les caractères limités positifs.
Vous pouvez spécifier ce que vous souhaitez définir comme limite.
Voici donc un exemple.
Nous créons un tableau de caractères 80.
Il dit bonjour, comment allez-vous, vous êtes dash mon nom est dash Jason.
Nous créons ensuite une chaîne constante qui représente le délimiteur, qui
est le moins, le tiret. Cela a l'air un peu différent, mais c'est toujours le moins, le tiret, ce
sont tous les deux des tirets.
Et puis nous créons notre pointeur qui est un jeton.
Parce que strtok va retourner
chacun de nos jetons.
Donc si nous appelons notre strtok et que nous passons en
string et que nous passons dans nos
délimiteurs s, token va être égal à la première chose qu'il trouve.
Donc, la première fois que vous appelez strtok, ça va être égal à bonjour
comment allez-vous l'espace, puis il trouve la correspondance avec le tiret.
Et si vous appelez
une deuxième fois, mon nom sera imprimé.
Si vous l'appelez une troisième fois,
il imprimera Jason car il passe par les tirets.
C'est pourquoi nous avons une boucle while ici. Nous disons que si le jeton n'est pas égal à
null, imprimez le jeton.
Et puis nous obtenons le jeton suivant en appelant strtok.
Et nous disons null comme premier paramètre et s
est notre deuxième paramètre et ensuite
nous, nous affichons. Alors regardons cela dans
les blocs de code car cela le rendra plus compréhensible.
Alors construisons ça. Nous venons de passer par cet exemple.
Je veux vous montrer quelle est la sortie, donc ce qui se passe ici est clair.
Donc, ici, vous verrez qu'il indique qu'il imprime
le premier jeton qui est bonjour comment allez-vous.
Eh bien, la première chose qu'il fait
est de trouver le premier jeton, de l'imprimer, bonjour comment allez-vous, je m'appelle et ensuite Jason.
Alors maintenant, nous avons bonjour comment allez-vous,
trouve le premier tiret, l'imprime. Mon nom est trouve le prochain jeton,
puis le troisième est Jason. Mais vous devez appeler le
jeton trois fois pour obtenir chaque jeton.
Le premier va tokenize sur le str.
Voyez le prochain que vous pouvez passer en null parce que vous ne voulez pas regarder à nouveau, vous voulez juste obtenir le jeton suivant.
Et donc vous passez un nul au second et vous passez juste un s.
Cela vous donnera le prochain jeton du jeton str.
C'est ainsi que vous pouvez utiliser strtok. Cela aide beaucoup à l'analyse.
Vous pouvez analyser quelque chose et éliminer certaines limites.
Les dernières fonctions dont je veux parler sont ces fonctions d'analyse de chaînes.
Il y en a une tonne, alors j'ai juste fourni un petit tableau ici.
Est inférieur, est supérieur. Il fait exactement ce que vous pensez qu'il ferait.
Il teste pour voir si un caractère est en minuscule ou en majuscule.
Nous testons certains caractères, mais ils sont utilisés dans des chaînes.
Et donc l'argument de chacune de ces fonctions est le caractère que vous souhaitez rechercher.
Et puis toutes ces fonctions renvoient une valeur non nulle de
type int si le caractère se trouve dans l'ensemble en cours de test.
Nous allons donc passer des caractères int à l'intérieur à la recherche de mots intérieurs.
Si nous avons une lettre majuscule à l'intérieur d'un mot, cela nous le dira et
nous pouvons également l'utiliser pour analyser des éléments individuels à la manière d'un caractère.
Ainsi, les valeurs de retour seront converties en vrai ou en faux afin
que vous puissiez également les utiliser comme booléens, ce qui est bien.
Donc, is lower retournera vrai si
un mot ou un caractère a une lettre minuscule.
Eh bien, voici un bel exemple que
je voulais parcourir, qui comptera le nombre de chiffres de lettres dans une chaîne entière.
Alors, exécutons ceci parce que ce sera
clair, mais ce que vous devriez remarquer, c'est que nous
créons un tampon, notre tampon d'entrée, puis nous créons trois entiers à compter.
Nous disons à l'utilisateur de saisir une chaîne
de moins de tant de caractères, nous la lisons ensuite.
Nous allons ensuite regarder cette chaîne pour voir
si elle contient certains caractères.
Nous allons donc parcourir cette chaîne en
examinant chaque index du tableau.
Voici donc notre exemple.
Encore une fois, buffer est notre tableau de
caractères qui va stocker les entrées. Nous allons utiliser scanf pour remplir cela.
Nous devons taper notre chaîne sans espaces, c'est une seule chaîne.
Nous allons le parcourir, parcourir chaque élément du tampon, puis appeler les fonctions
is alpha, is digit ou is punct pour voir si ces
caractères sont là, puis il incrémentera
en fonction de cela, que ce soit ou non. renvoie vrai ou faux, puis il
affichera le nombre de lettres, chiffres et caractères de ponctuation contenus dans cette chaîne.
Lançons ceci.
Je vais juste entrer quelque chose avec un tas de
majuscules, peut-être quelques chiffres.
Ensuite, quand je frappe retour, ça compte tout. Donc, il dit
que ma direction contenait 24 lettres, 4 chiffres et 1
caractère de ponctuation, les deux points.
Joli petit programme qui utilise ces fonctions de caractères mais
qui est utile avec um analyser une chaîne parce que c'est
ce que vous faites, vous analysez la chaîne, mais vous
ne faites que passer par caractère. Merci.