>> HOPARLÖR 1: bir proqram yazmaq edək ki, olmadan istifadəçi bir string alır
CS50 Kitabxana istifadə edərək GetString fəaliyyət göstərir.
Bunu etmək üçün, biz irəliyə getmək və istifadə edəcəyik scanf, funksiyası ki GetString
funksiyası həqiqətən istifadə edir başlıq altında.
Amma qəsdən bunu gedirəm bir arabası şəkildə.
Mən hesab edirəm ki, bir şəkildə etmək üçün gedirəm doğru ola bilər, lakin bu çıxır ki,
mənim fərziyyə olacaq olduqca, olduqca qüsurlu olması.
Və əslində, olduqca təhlükəli.
Çünki haqqında Ben biri kimi bugs düşmənləri tərəfindən istismar edilə bilər etmək
belə ki, sizin maşın və ya proqram potensial qəbul edilə bilər.
>> Aşağıdakı kimi başlasın.
Birinci bizim simli bəyan edək, başqa, bir char ulduz kimi indi məlum
və s zəng.
Növbəti bir simli üçün istifadəçi təklif imkan verir, "edin simli." ilə Və
İndi istifadəçi simli almaq imkan dırnağı bağlamaq quote, "% s." scanf istifadə Ilə
başqa sözlə, ki biz scanf məlumat imkan əslində bir string almaq üçün gözləmək yoxdur
istifadəçi.
>> Amma indi biz scanf demək lazımdır bir başqa şey -
simli qoymaq harada ki, istifadəçi təmin edir.
Bəli, mən sadəcə başlamaq üçün gedirəm vergül s, mən istərdim ki, ifadə ilə
scanf orada string qoymaq üçün.
Mən növbəti bir şey çap gedirəm Bu% s üçün printf "sayəsində kimi
backslash n vergül. "Və həmişə olduğu kimi, mən simli, s keçmək gedir.
İndi xilas edək tərtib və bu run biz edə bilməz, əgər proqram və görmək
Bu problem I proqnozlaşdırılır.
>> Scanf-1 olun.
./scanf-1.
String edin.
Nin kimi bir şey təmin edək "salam". "Null üçün təşəkkür edirik." Hmm, ki, deyil
Mən gözləyirdim nə.
Bəs burada olub?
>> Biz bəyan çünki Bəli, bu çıxır s bir char ulduz kimi ancaq etmədik
həqiqətən ünvanı s saxlanılır yaddaş faktiki yığın, scanf etmədi
simli qoymaq yerdə var ki, daxil tipli istifadəçi
Həqiqətən, istifadəçi olsaydı indi yazın "salam" dən daha uzun string
Məsələn, bir neçə mətn xətləri və ya mətn bir neçə maddələr, kifayət qədər var
biz vadar edə bilər ki, mümkün bir seqmentasiya günah deyilən.
>> Scanf bilmək niyyətində deyil, çünki Mən, həqiqətən, bir ünvan qoymaq deyil
s daxilində.
Əksinə, bəzi dəyəri görmək olacaq s, bəzi model bit ki, may
çox yaxşı bir zibil dəyəri, orada yalnız təsadüfən.
Və scanf hələ də yazmaq cəhd edir ki, ünvan üçün istifadəçi string,
bir zibil dəyəri, hətta əgər həqiqətən bir qəza vadar edə bilər.
>> Belə ki, necə biz bu düzeltmek üçün gedir?