>> SPEAKER 1: Да се ​​напише програма, която получава низ от потребителя без по-
използване на CS50 библиотеката функционира GetString.
За да направите това, ние ще вървим напред и да използват scanf, функцията че GetString
функция всъщност използва под предния капак.
Но аз ще направя това умишлено в бъги начин.
Отивам да се направи по начин, който мисля, че би било правилно, но се оказва, че
предположението ми ще бъде доста, доста погрешна.
И в действителност, много опасно.
Защото бъгове като едно аз съм за да направи може да бъде използвана от противниците
такава, че вашата машина или вашата програма могат да бъдат взети над потенциално.
>> Нека започнем, както следва.
Първо, нека да заявяваме нашата поредица, по друг начин, известен сега като знак звезда,
и да го наречем е.
Позволява следващата напомни на потребителя за низ, Както и при "низ моля." И
нека сега се низ от потребителя използване на scanf, в кавички, "% S". В
С други думи, нека да информира scanf, че ние ми всъщност очаквате да получите низ
от потребителя.
>> Но сега трябва да кажа scanf едно друго нещо -
къде да се постави низ че потребителят осигурява.
Е, аз отивам да се доста просто да започнете със запетая ите, като се посочва, че бих искал
scanf да постави низ там.
Аз следващия ще разпечатате нещо като ФОРМАТ "благодаря за% S
наклонена черта н запетая. "И както винаги, аз съм ще премине в низ, S.
Сега нека да спаси, компилирате и стартирате тази програма, и да видим дали не можем да индуцира
проблемът, прогнозира.
>> Направете scanf-1.
./scanf-1.
String моля.
Да се ​​предложи нещо подобно, "здравей". "Благодаря за нула." Хм, това не е
това, което аз очаквах.
И така, какво става тук?
>> Е, оказва се, защото ние декларирахме и като знак звезда, но не го направихме
всъщност съхранява в и адреса на един действителното парче памет, scanf не направих
Трябва навсякъде да се сложи низа че потребителят въвели инча
В действителност, ако потребителят се налага да въвеждате в предприятието много по-дълъг низ от "здравей"
например няколко реда текст, или няколко параграфа от текст, това е доста
възможно, че ние може да предизвика т.нар сегментиране вина.
>> Защото scanf няма да знаят, че Аз не съм всъщност сложи адрес
във вътрешността на S.
Вместо това, тя се случва да видя някаква стойност в S, някои модел на битовете, които могат
много добре да бъде стойност за боклук, там просто по случайност.
И scanf все още продължава да се опитам да напиша потребителския низ на този адрес,
дори ако това е стойност за боклук, които наистина може да предизвика катастрофа.
>> Така че как ще се определи това?