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?