Hallo, en welkom terug. In deze lezing wil ik het hebben over snaarfuncties.
Ik heb eerder
gezegd dat strings, karakterarrays geen
variabel gegevenstype zijn in c.
Je kunt dus alle operators gebruiken, maar
je zult nog steeds veel dingen op strings moeten kunnen doen.
Je kunt ze manipuleren.
Je zult de lengte willen krijgen. Je wilt ze
vergelijken, allerlei dingen zetten ze waarschijnlijk om.
Dus gelukkig wordt de standaardbibliotheek geleverd met een aantal functies die u
kunt gebruiken om dit soort bewerkingen uit te voeren.
Ik ga eerst praten over enkele van de meest voorkomende en
dan zullen we in andere lezingen ingaan op enkele meer specifieke.
We weten dus al dat een
tekenreeks een tekenreeks is die wordt afgesloten met een null-teken.
Tekenreeksen worden vaak gebruikt in c-programma's.
C biedt gelukkig veel functies die speciaal zijn ontworpen om met strings te werken.
Degenen die we gaan bespreken, zijn de meest voorkomende die u zult gebruiken.
Eerst de lengte van een string verkrijgen met behulp van de str length-functie.
Kopiëren van de ene tekenreeks naar de andere.
Onthoud dat ik je eerder heb verteld dat je de toewijzingsoperator niet kunt gebruiken om een tekenreeks toe te wijzen.
Dus wat je doet, is dat je str copy of strn copy gebruikt.
Ook het combineren van twee tekenreeksen, aaneenschakeling.
Er is een str-kat en een strn-kat.
En bepalen of twee tekenreeksen gelijk zijn.
Nogmaals, de operator is gelijk aan is niet geschikt voor het vergelijken van strings
omdat het arrays zijn.
Dus als je strings wilt vergelijken, moet je speciale functies
van de c-bibliotheek gebruiken. Str vergelijken en strn vergelijken.
Laten we het eerst hebben over de lengte.
Al deze functies zijn gedefinieerd in de string. header-bestand, dus u moet dat
opnemen wanneer u een van deze functies aanroept of aanroept.
De lengte van een string krijgen.
Str-lengte is een functie die de lengte van de tekenreeks vindt, het is vrij eenvoudig.
Het wordt geretourneerd als een grootte t-variabele.
Je kunt de variabele maat t vrijwel door elkaar gebruiken met een int.
Maar eerst moet je dat string-headerbestand opnemen als je str-lengte wilt gebruiken en dit is
hoe je het gebruikt.
U maakt in feite een letterlijke tekenreeks tussen dubbele aanhalingstekens en wijst deze toe aan een tekenreeks.
U geeft niet de grootte van de tekenreeks op.
De compiler doet dat voor je en voegt de nulterminator toe.
Zodra je mijn string hebt gedefinieerd met
een stringconstante, kun je str-lengte aanroepen en dat teken gewoon doorgeven,
best leuk.
Het is een van de meest gebruikte omdat je vaak deze lengte van een tekenreeks wilt
hebben wanneer je validatiecontroles doet of iets anders, als je
zeker wilt zijn dat er geen bufferoverloop is, je dat ook kunt doen.
Deze functie verandert de string.
Dus de functiekop gebruikt geen constante bij het
declareren van de formele parameterreeks.
Als je naar string zou gaan kijken. h inside
user include in uw directory, zou u zien dat het
niet als een constante is gedefinieerd.
Snaren kopiëren. Het kopiëren van tekenreeksen is
ofwel het wijzigen van een bestaande tekenreeks, of
het wijzigen van een bestaande tekenreeks die enkele gegevens bevat.
Of als er niets in zit, wil je er iets in doen.
Aangezien u geen verhoging in c kunt toewijzen, kunt u ook geen strings toewijzen. Ik heb dit eerder genoemd, het
declareren van een teken en vervolgens het gebruik van de equals-toewijzingsoperator werkt niet.
Dus wat je moet doen, is dat je de str-kopiefunctie moet gebruiken om
een string naar een bestaande string te kopiëren.
Het is het equivalent van een operator voor strings, een toewijzingsoperator.
Als we twee tekenarrays als bron en bestemming declareren, hoeven
we alleen maar str copy source te zeggen en wat de bron
ook is, we kunnen de string in de string plaatsen en
hetzelfde met de bestemming.
Je kunt er ook variabelen in plaatsen als je die wilt kopiëren.
Maar wat we hier doen, is dat de eerste parameter is waar je naartoe kopieert.
De tweede parameter is de tekenreeks die u kopieert.
Dus de bron zou hebben dat dit de bron erin is na str-kopie.
Bestemming of bestemming zou deze bestemming erin
hebben na de str-kopie-aanroep.
De str-kopieerfunctie controleert niet of de bronstring daadwerkelijk in de doelstring past.
Dus wat zou er gebeuren als je een grote snaar had.
Dus wat zou er in dit vorige voorbeeld gebeuren als een bestemming 100 tekens bevat.
En in plaats van dit als bestemming te hebben, had het 100 tekens.
Je hebt geprobeerd het te kopiëren naar de
bron die maar 50 tekens bevatte. Er zou een probleem zijn.
De doeltekenreeks zou groter zijn dan de brontekenreeks die u kopieert.
Dus als we zouden proberen om str copy naar de broncode te kopiëren in plaats van dit te kopiëren als de bron die we
erin hebben gestopt, is dit vijf keer of tien keer afkomstig, wat het ook is, en één keer meer dan 50, dan
zou er een fout zijn.
En dat zal ik aantonen.
Dus een veiligere manier om strings te kopiëren is om strn copy te gebruiken. U zult merken dat n kan worden
omgezet in strn-kopie.
Strn-kopie neemt een derde argument.
Het maximum aantal tekens dat moet worden gekopieerd.
Dus hier geef je eigenlijk aan hoeveel je wilt kopiëren.
Dus als je een bron van 40 hebt en een bestemming van 12 formaten, kun je
eerst een m-set doen die alleen de grootte van de gegevens in een bestemming instelt op nul-terminators,
op die manier wanneer je iets toevoegt, zal het er automatisch zijn, don maak je daar geen zorgen over.
De str-kopie gaat hallo hoe gaat het met de bron kopiëren, en het gaat niet
controleren of hoe hoe gaat het met je groter is dan de bron.
Maar als je een strn-kopie maakt en je kopieert naar een
bestemming, dan wordt de bron gekopieerd en worden alleen de eerste 10 tekens gekopieerd.
Dus dat derde argument moet overeenkomen met de grootte van de bestemming.
Dus laten we ingaan op codeblokken en kijken naar de str-lengte en kijken naar het kopiëren van strings om
precies te zien hoe deze werken.
Dus hier hebben we onze belangrijkste.
En om de snaarlengte te krijgen, is heel eenvoudig.
We gaan onze karakterreeks maken. We weten hoe we een karaktergebied moeten creëren. We willen de maat niet
specificeren, maar we moeten eerst de naam plaatsen en dan de haakjes.
En dan kunnen we het initialiseren met wat we
maar willen, bijvoorbeeld tussen dubbele aanhalingstekens. Dubbele aanhalingstekens vertegenwoordigen letterlijke tekenreeksen.
Dus ik kan gewoon zeggen dat mijn naam Jason is.
Het eindresultaat hiervan is dat
s een array van 17
tekens wordt.
Al deze karakters plus de nulterminator.
De nulterminator is de backslash nul.
U hoeft dat daar niet in te voeren omdat het automatisch wordt toegevoegd door de compiler.
Dat is hoe we een tekenreeks kunnen initialiseren en maken in een tekenreeks.
Om het vervolgens af te drukken, hoeven we alleen maar printf te zeggen en te zeggen dat de lengte is.
En dan plaatsen we het percentage s
als de formaatspecificatie om een tekenreeks weer te geven.
En dan zeggen we alleen de naam van de string.
En om niet in de war te raken, laten we gewoon mijn string zeggen.
En we hoeven de ampersand niet te gebruiken zoals we eerder deden, eerdere voorbeelden,
we kunnen gewoon mijn string zeggen. Als we dit compileren en uitvoeren,
moeten we er misschien ook voor zorgen dat we de stringheader opnemen.
Als we dit compileren en uitvoeren, zie je de lengte van de string.
Dus de lengte is en ik heb de stringlengte-functie niet aangeroepen.
Dus je moet de functie daadwerkelijk aanroepen als je de lengte wilt weergeven, dus
je doet gewoon zoiets. Je plaatst de string binnen de str-lengte.
Als je het nu uitvoert, zou je de lengte van de string zien.
Dit hoeft geen string te zijn, maar een feitelijke.
Dus zo zou ik de string weergeven. Als ik de lengte van de string wil
weergeven, doe ik procent d in de aanroep van de functie.
Als ik het nu
uitvoer, zul je merken dat het er eigenlijk 16 uitprint, wat de lengte is.
Het is dus een vrij eenvoudige functie om str-lengte te gebruiken. Als je strings wilt
kopiëren, gebruik je str Compare.
En u wilt strn-vergelijking gebruiken om de bytes daadwerkelijk te specificeren.
Dus hier als we hebben dat mijn naam Jason
is, en dan maken we nog een
string, eigenlijk houden we het gewoon zo. We hoeven niet eens
te specificeren en wat we gaan doen
is dat we gaan zeggen maak een andere string
genaamd temp en dat zal gelijk zijn aan
str en vergelijken, we gaan doorgeven wat we willen kopiëren naar.
Maak gewoon een lege tekenreeks en we gaan er gewoon
een maat 50 van maken.
En wat we hier gaan doen, is strn kopiëren.
De eerste parameter is waar we do willen kopiëren, we gaan temp zeggen.
De tweede parameter is wat we willen kopiëren en dat is mijn string.
En dan willen we niet meer dan 50 bytes doorgeven.
Dus we kunnen de grootte van de temp zeggen om te zeggen
dat we niet meer dan 50 bytes willen doorgeven. En je wilt waarschijnlijk -1 doen
voor de nulterminator.
Op deze manier is die derde parameter echt belangrijk omdat we nooit bufferoverlopen zullen hebben.
Gebruik altijd strn copy en niet str copy.
En dan kunnen we hier onze string weergeven om te zien of deze is gekopieerd.
We zouden temp kunnen zeggen, verander het in een procent s.
En als we dit bouwen,
zouden we moeten zien, niet de lengte, we zouden moeten zien dat de
string zoiets is en eindigen met een puntkomma.
Nu moeten we compileren doen we.
Dus nu voeren we het uit. We zouden gewoon onze string moeten zien die erin is gekopieerd.
Dus we zien dat mijn naam Jason is en dat die
in temp is opgeslagen omdat we temp hebben uitgeprint.
Maar gebruik altijd strn-kopie. Gebruik geen str copy, dat
zorgt ervoor dat je geen buffer overflows hebt.
En de derde parameter moet altijd de
bestemming zijn, niet de bron,
maar de bestemming. Het zou zinloos zijn om deze hele string te kopiëren.
Want als dit kleiner is, krijg je problemen. Zeg dus altijd de maat hiervan.
En je ziet dat je de operator sizeof
kunt gebruiken om te zien hoeveel bytes er in een teken zitten.
Laten we het hebben over wat meer functies.
Dus we weten hoe we de lengte kunnen krijgen, we weten hoe we strings moeten kopiëren, hoe zit het met het aaneenschakelen van strings.
De str cap-functie heeft twee argumenten, twee strings als argumenten
en kopieert de tweede string aan het einde van de eerste.
De tweede string wordt niet
gewijzigd, alleen de eerste. Het geeft de waarde van het eerste argument terug.
Het adres van het eerste teken de tekenreeks waaraan de tweede tekenreeks wordt toegevoegd.
Dus geef iets terug en vertel je waar je het hebt toegevoegd als je dat ooit nodig hebt gehad.
Dus hier is een voorbeeld, we maken een tekenreeks van mijn
tekenreeks en deze bevat alleen mijn tekenreeks met een null-terminator.
We maken een tekenreeks van invoer, die 80 is, deze is leeg.
We zeggen voer een tekenreeks in die moet worden samengevoegd. Wij lezen het in.
En dan koppelen we het aan elkaar.
We printen de originele string uit, gevolgd door de aaneengeschakelde string en dan de invoer.
Dus hierna zou alles wat je invoerde aan het einde
van mijn reeks worden geplaatst. Dus als je Jason invoert, zou het mijn spatiereeks Jason zijn.
Daar zou mijn string gelijk aan zijn.
Omdat je er een str-kat op doet.
Eerst printen we de string uit en dan noemen we str cat erop.
Input zal eigenlijk gelijk zijn aan wat er is ingevoerd, mijn
string gevolgd door wat er ook is ingevoerd.
We zullen dit voorbeeld zo bekijken. Nu, net als str
copy, heeft str cat ook een strn end cat.
Dus de gecombineerde versie wordt de nieuwe eerste string.
Dus net als string-aaneenschakeling met de str cat, is er
een strn cat.
Str cat heeft hetzelfde probleem met str copy. Het kan een bufferoverloop hebben. Het zorgt er niet
echt voor dat de tweede string in de eerste array past.
Dus als je niet genoeg ruimte hebt in die eerste array, kun je bufferoverloopproblemen krijgen.
Dus wat wil je een strn kat gebruiken.
Het tweede argument geeft het maximale aantal tekens aan dat moet worden toegevoegd.
Dus als je bijvoorbeeld een strn cat en
two strings bugs in een add-on doet, worden alleen de eerste 13 tekens van de add-on aan bugs toegevoegd, afhankelijk
van wat het eerst komt. Als de add-on kleiner is
dan 13, wordt deze alleen toegevoegd totdat u de nul-terminator ziet.
Dus in dit voorbeeld maken we twee strings.
Dit is de bron van deze bestemming. We doen een strn kat.
We kopiëren uiteindelijk slechts 15 tekens
naar de bestemming. Dus wat de grootte van de bestemming ook is, het
is de grootte van de bestemming plus 15 en dan printen we het uit.
Dus laten we dit nog eens bekijken in codeblokken.
Dus hier is ons voorbeeld en we gaan een array met twee
tekenreeksen maken, de ene maat 50, de andere maat 50.
We gaan twee str-kopieën maken om ze op gegevens in te stellen.
Dit is de bestemming van de bron. En dan op lijn 12, doen we de strn cat.
En de bestemming zal zijn waar we aan samenvoegen.
Dus de bron wordt wat we gaan samenvoegen.
En we gaan maar 15 tekens toewijzen.
Dus als de bron groter was dan 15, zouden
we ze niet allemaal kopiëren.
Dus als we dit bouwen en
uitvoeren, zul je zien dat er nu
staat dat dit het bronbestand is of dat dit de bestemming
is, gevolgd door dit is de bron.
Dus er staat dat dit de bestemming is, dit is de bron.
Het koppelde dat aan het einde van de bestemming.
Dus je wilt altijd strn cat gebruiken voor aaneenschakeling, zodat je geen buffer-overflows hebt.
Laten we het hebben over str Compare, wat ik steeds weer zeg
in plaats van str copy, str Compare.
Dus voor het vergelijken van strings moeten we ook een functie gebruiken.
Als je de ene string met de andere wilt vergelijken,
kun je geen dubbele gelijken gebruiken, dat controleert alleen op referenties of
je hetzelfde adres hebt of niet. Dus wat je moet gebruiken is str Compare.
Dit gaat de inhoud van de string vergelijken.
Het vergelijkt de array niet. Het kan dus worden gebruikt om
strings te vergelijken die zijn opgeslagen in arrays van verschillende groottes.
Het vergelijkt geen karakters.
U kunt argumenten zoals appels en a tussen dubbele aanhalingstekens gebruiken, maar
u kunt geen tekenargumenten gebruiken, zoals een enkel teken a.
Deze functie doet voor strings wat relationele operatoren doen voor getallen.
Dus de vergelijkingsfunctie gaat een
waarde teruggeven die je vertelt of de string gelijk is of niet,
of hij groter of kleiner is dan.
Als het gelijk is, geeft het nul terug.
Als het kleiner is dan, zal het minder dan nul retourneren, als str
één kleiner is dan str twee.
En als str twee kleiner is dan str één, wordt het groter dan nul geretourneerd.
En wat houdt dit dan precies in? Nou, laat me je een
voorbeeld geven van hoe dit werkt.
Laten we dit in de codeblokken plaatsen en uitvoeren.
Maar hier doen we een aantal str-vergelijkingen, en we gaan je vertellen wat de waarden zijn, of ze kleiner dan
of groter zijn dan omdat het niet erg duidelijk is.
Dus laten we dit nemen en ernaar kijken in codeblokken.
Dus hier is ons voorbeeld. En we vergelijken een aantal strings en tonen dan gewoon
de resultaten van str Compare, of
het nu een nul is of wat dan ook.
Dus als je twee strings a en a vergelijkt, moeten ze tussen dubbele aanhalingstekens staan.
En wat je hier ziet, wat we aan het doen zijn, is uitprinten wat we noemen.
Dus we zijn
de aanhalingstekens aan het afbakenen. We plaatsen de backslash zodat we een aanhalingsteken
afdrukken en de string niet beëindigen. Maar als we a en a
vergelijken, zou dit nul moeten opleveren. Omdat nul betekent dat strings gelijk zijn.
Als we a en b vergelijken, zou str vergelijk minder dan moeten
opleveren.
Omdat a kleiner is dan b.
B a moet een waarde groter dan nul retourneren.
Maar laten we dit doornemen, zorg ervoor dat ik geen fouten maak en
we zullen het ook daadwerkelijk zien in de output.
Dus als we dit
uitvoeren en dit helpt u te onthouden welke nummers worden geretourneerd.
Dus als je a en a vergelijkt, krijg je eigenlijk 0.
Als je a en b vergelijkt, b is kleiner dan
a, dus het is een negatieve, iets kleiner dan nul, dan
had ik misschien het tegenovergestelde gezegd, zelfs als ik
ze nog steeds door elkaar haal. Omdat a groter is dan b, is
a groter dan b, min één.
B is kleiner dan a, dus je krijgt iets groter dan nul dat een één is.
C is groter dan a, dus je krijgt één, net als
b groter was dan a.
En dan vergelijk je hoofdletters en kleine letters.
Wanneer u hoofdletters en kleine letters vergelijkt, doet het het omgekeerde. Z is eigenlijk kleiner dan
de kleine letter a.
Dus kapitaal is altijd kleiner dan kleine letters.
Als je appels en appels probeert te vergelijken, wordt het 1 omdat appel
minder is dan appels.
En zo werkt de vergelijking. Het is belangrijk om de 0 groter dan 1 of
kleiner dan 1 te begrijpen. Weer minder dan nul
wil zeggen dat de eerste reeks kleiner is dan de
tweede reeks.
En groter dan nul zal zeggen dat de eerste reeks groter is dan de tweede reeks.
Deze functie is zeer eenvoudig te gebruiken. U hoeft zich geen zorgen te
maken over enige vorm van strn-vergelijking, omdat het niet uitmaakt hoe groot de arrays
zijn die u vergelijkt.
De str-vergelijkingsfunctie vergelijkt strings totdat het corresponderende karakters vindt die verschillen.
Dus het kan helemaal tot aan het einde van een van de snaren zijn.
De functie Strn-vergelijking vergelijkt de tekenreeksen totdat ze verschillen of totdat een aantal
tekens is vergeleken dat is gespecificeerd door het derde argument.
Dus in dit geval hoeft u strn Compare niet
te gebruiken voor bufferoverflows. Het bestaat, maar je zou het
alleen gebruiken als je slechts een bepaald aantal tekens wilt vergelijken.
Het wordt anders gebruikt dan
de str copy of de strn copy of de strn cat.
De strn-vergelijking zegt alleen dat ik maar zoveel tekens wil weergeven.
Het zou dus handig zijn als u alleen op zoek bent naar een voorvoegsel.
Dus als je wilt zoeken naar strings die beginnen met astro, dan
zou je het zoeken kunnen beperken tot de eerste vijf karakters en
zou je op deze manier strn Compare gebruiken.
Dus in dit voorbeeld zie je dat we zeggen is gelijk aan nul.
Je ziet vaak een if-statement zoals dit wanneer je str Compare gebruikt.
Je ziet str vergelijk in deze verklaring en is gelijk aan nul om te zeggen dat het gelijk is.
Dus strn Compare gebruikt de eerste vijf karakters, vergelijkt
astro met de eerste vijf karakters van astronomie.
Het zal zeggen dat het het gevonden heeft. Het wordt gelijk aan nul, en het gaat om gevonden astronomie.
Als je hetzelfde doet, maar het vergelijkt met een andere string die verbazingwekkend wordt
genoemd, zal het het niet vinden, het zal het daadwerkelijk weergeven - het
zal zeggen dat verbazingwekkend groter is dan astro. Dus het gaat iets weergeven dat groter
is dan 0, wat een 1 is en het
zal geen gegevens weergeven.
Gebruik dus str Compare wanneer u strings voor alle inhoud vergelijkt.
Gebruik strn-vergelijking als u alleen het voorvoegsel met een tekenreeks wilt vergelijken.
Hetzelfde type syntaxis of strn vergelijk alleen dat derde argument.
Dus we hebben veel gesproken over een
aantal echt belangrijke functies die we gaan gebruiken,
voornamelijk str length, strn copy, strn cat en strn Compare.
We krijgen een uitdaging waarbij je deze functies moet gebruiken om je ermee
vertrouwd te maken.
Maar je zult hier echt vertrouwd mee raken, want je zult
ze uiteindelijk steeds weer opnieuw gaan gebruiken. Dank u.