>> LUIDSPREKER 1: Laten we een programma schrijven dat krijgt een string van de gebruiker zonder
met behulp van de CS50 Bibliotheek functioneren GetString.
Om dit te doen, zullen we doorgaan en gebruiken scanf, de functie die de GetString
functie daadwerkelijk gebruikt onder de motorkap.
Maar ik ga dit bewust doen in een buggy manier.
Ik ga doen op een manier die ik denk zou goed zijn, maar het blijkt dat
mijn veronderstelling gaat heel, heel gebrekkig.
En inderdaad zeer gevaarlijk.
Omdat insecten zoals degene die ik ben over te maken kunnen worden uitgebuit door tegenstanders
zodanig dat uw machine of je programma kan mogelijk worden overgenomen.
>> Laten we beginnen als volgt.
Laten we eerst verklaren onze reeks, nu wel bekend als een char ster,
en noem het is.
Laat naast vraagt ​​de gebruiker om een ​​string, als met "string alstublieft." En
laten we nu krijgen de letters van de gebruiker gebruik scanf, citaat unquote, "% s." In
Met andere woorden, laten we informeren scanf dat we hoeft in feite verwacht een string te krijgen
van de gebruiker.
>> Maar nu moeten we scanf vertellen een ander ding -
waar om de string te zetten dat de gebruiker biedt.
Nou, ik ga gewoon beginnen met komma s, met vermelding dat ik zou willen
scanf om de string daar te zetten.
Ik ga naast gaan om uit te printen iets zoals printf "bedankt voor de% s
backslash n komma. "En zoals altijd, ik ben gaat pas in de string, s.
Laten we nu eens redden, compileren en uitvoeren van deze programma, en kijken of we niet kunnen induceren
het probleem dat ik voorspelde.
>> Maak scanf-1.
./scanf-1.
String alstublieft.
Laten we zorgen voor iets als, "hallo." "Bedankt voor de nul." Hmm, dat is niet
wat ik verwachtte.
Dus wat is hier aan de hand?
>> Nou, het blijkt dat, omdat we verklaard s als een char ster maar wij niet
eigenlijk in s het adres van een opgeslagen daadwerkelijke stuk van het geheugen, scanf niet
overal hebben om de string te zetten dat de gebruiker intikt
Sterker nog, als de gebruiker zijn om te nu te typen in een veel langere reeks dan "hallo"
bijvoorbeeld meerdere regels tekst of meerdere alinea's tekst, het is heel
mogelijk dat we zouden kunnen leiden tot een zogenaamde segmentation fault.
>> Omdat scanf is niet van plan om te weten dat Ik heb niet echt zetten een adres
binnenkant van s.
Integendeel, het gaat om een ​​bepaalde waarde te zien in s, sommige patroon van bits die kunnen
een vuilnisbak waarde zeer goed, er slechts bij toeval.
En scanf nog gaan proberen om te schrijven de gebruiker string naar dat adres,
zelfs als het een vuilnis waarde, die inderdaad een crash kon veroorzaken.
>> Dus hoe gaan we dit oplossen?