>> ЗВУЧНИК 1: Да се ​​напише програма која добива низа од корисникот без
користење на CS50 библиотека функционираат GetString.
Да го направите ова, ние ќе одиме напред и да го користите scanf, функцијата што GetString
функција всушност користи под хауба.
Но јас ќе одам да го направите ова намерно во кабриолет начин.
Одам да се направи на начин кој мислам ќе биде во право, но излегува дека
мојата претпоставка се случува да биде доста, доста недостатоци.
И всушност, доста опасни.
Бидејќи на грешки како онаа јас сум за да направи може да се експлоатираат од страна на противниците
така што вашата машина или вашата програма може да се земе во текот потенцијално.
>> Ајде да започне како што следи.
Прво нека го објавиме нашиот стринг, инаку позната сега како знак ѕвезда,
и повик тоа.
Овозможува следните извести корисникот за стринг, како и со "стринг те молам." И
ајде сега да добијат низа од корисникот користење scanf, цитат unquote "% s." Во
Со други зборови, да го извести scanf дека ние се всушност очекувате да добиете низа
од корисникот.
>> Но сега ние треба да се каже scanf една друга работа -
каде да се стави на стринг кој корисникот обезбедува.
Па, јас ќе одам да доста едноставно да започнат со со запирка с, наведувајќи дека би сакал
scanf да се стави на низа таму.
Јас сум следната случува да се печати од нешто како printf "Ви благодариме за% s
обратна коса црта n запирка. "И како и секогаш, јас сум ќе помине во низа, с.
Сега ајде да ги зачувате, состави, и извршите оваа програма, и да видиме ако не можеме да предизвикаат
проблемот предвидов.
>> Направи scanf-1.
./scanf-1.
Стринг молам.
Ајде да се обезбеди нешто како, "Здраво". "Ви благодариме за ништовни." Хм, тоа не е
она што јас го очекував.
Значи она што се случува овде?
>> Па, излегува, бидејќи ние прогласи s како знак ѕвезда, но ние не сме
всушност се чуваат во ОК адресата на некоја вистински парче на меморија, scanf не го
мора секаде да се стави на низа дека корисникот внесе внатре
Всушност, ако корисникот се сега напишете во многу подолго низа од "здраво"
на пример неколку линии на текст или неколку ставовите на текст, тоа е сосема
можно е дека ние може да предизвикаат т.н. сегментација вина.
>> Бидејќи scanf нема да знаете дека Не сум всушност се стави адреса
внатрешноста на s.
Напротив, тоа се случува да видите некои вредност во, некои модел на битови кои можат
многу добро да биде ѓубре вредност, има само случајно.
И scanf се уште се случува да се обидат да се напише корисникот низа на таа адреса,
дури и ако тоа не е ѓубре вредност, која навистина би можеле да предизвикаат несреќа.
>> Па, како ќе се дојде да го надминете овој?