HÖGTALARE 1: Låt oss skriva ett program som får en sträng från användaren utan använder CS50 bibliotekets fungera GetString. För att göra detta, kommer vi att gå vidare och använda scanf, den funktion som GetString Funktionen använder faktiskt under huven. Men jag ska göra det här medvetet i en buggy sätt. Jag kommer att göra på ett sätt som jag tror skulle vara rätt, men det visar sig att mitt antagande kommer att vara ganska, ganska bristfällig. Och i själva verket är ganska farliga. Eftersom buggar som den jag är på väg att gör kan utnyttjas av motståndare så att din maskin eller ditt program kan tas över potentiellt. Låt oss börja så här. Först ska vi förklara vår sträng, annars känd nu som en röding stjärna, och kallar det är. Lets nästa fråga användaren efter en sträng, som med "sträng snälla." Och Låt oss nu få strängen från användaren använda scanf, citat unquote, "% s." I andra ord, låt oss informera scanf att vi tror faktiskt räkna med att få en sträng från användaren. Men nu måste vi tala om för scanf en annan sak - var att sätta den sträng som användaren ger. Tja, jag ska helt enkelt starta med kommatecken s, anger att jag vill scanf sätta strängen där. Jag nästa kommer att skriva ut något som printf "tack för% s backslash n kommatecken. "Och som alltid, jag är kommer att passera i strängen, s.. Nu ska vi spara, kompilera och köra programmet, och se om vi inte kan förmå problemet jag förutspådde. Gör scanf-1. ./scanf-1. String snälla. Låt oss ge något i stil med "Hej." "Tack för den null." Hmm, det är inte vad jag hade förväntat mig. Så vad händer här? Jo, det visar sig att vi förklarade s som en char stjärna men vi gjorde inte faktiskt lagras i er adressen till en faktiska bit av minnet, gjorde scanf inte har någonstans att sätta strängen att användaren skrivit i. Faktum är att om användaren skulle nu skriva in en mycket längre sträng än "hej" exempelvis flera textrader eller flera textstycken, det är ganska möjligt att vi skulle kunna framkalla en så kallad segmentering fel. Eftersom scanf inte kommer att veta att Jag har faktiskt inte lagt en adress insidan av er. Snarare kommer det att se något värde i s, vissa mönster av bitar som kan mycket väl vara ett skräp värde, det bara av en slump. Och scanf fortfarande kommer att försöka skriva instruktionssträngen till den adressen, även om det är en soptunna värde, vilket kan faktiskt framkalla en krasch. Så hur ska vi fixa detta?