C Programlama #24 | Karakter Dizileri: Metin, Sonlandırıcı ve scanf
Diziler (Arrays)Eğitmen: Dr. Süleyman Burak ÇELİK
Merhaba kelimesinde 7 harf var ama dizisi 8 bayt tutuyor. Yirmi dördüncü derste C'de metinlerin nasıl saklandığını, sondaki görünmeyen sıfırı ve scanf ile güvenli okumayı görüyoruz. char selam[] = "merhaba" tanımında 7 harf var, ama sizeof 8 diyor. lldb ile dizinin baytlarına bakıyoruz: 6d 65 72 68 61 62 61 00. Her karakter aslında küçük bir sayı: m'nin kodu onaltılık 6d, yani 6 · 16 + 13 = 109; ASCII tablosunda a 97 ve m, a'dan 12 sonra gelir: 97 + 12 = 109. Sekizinci bayt 0: sonlandırıcı karakter, '\0'. Tırnak içindeki metne derleyici bu baytı kendisi ekler; tek tek karakterlerle yazınca onu biz yazmalıyız. Karakterlere indisle ulaşıyoruz: selam[0] m (109), selam[3] h (104), selam[7] 0; ilk harfi 'M' yapınca dizi Merhaba olur ('M' = 109 - 32 = 77), selam[3]'e '\0' yazınca printf yalnızca Mer yazar: %s ilk 0 baytında durur. Bir metni karakter karakter dolaşan döngü sonlandırıcıya bakar; 7 tur döner: metnin uzunluğu 7, dizinin boyu 8. Sonlandırıcıyı unutunca printf durmuyor: gcc ile derlenen programda ders'in arkasından değeri 1 olan görünmez bir bayt çıkıyor (od -c ile görüyoruz), clang ile ise dersC! yazıyor; lldb, s'den sonra bellekte hemen arkadaki diğer dizinin baytlarını (C, ! ve 0) gösteriyor: tanımsız davranış. Klavyeden kelime okurken yirmi karakterlik bir diziye %19s yeter; dizinin adının önüne & konmaz. Ada Kaya yazınca scanf ilk boşlukta duruyor: ad Ada, Kaya ise ikinci scanf'e kalıyor. Genişlik vermeyince altı baytlık kod dizisine yirmi harf yazılıyor ve komşu puan değişkeni 100'den 1280658241'e dönüyor; lldb'ye göre puan, kod'un 12 bayt ilerisinde ve oraya düşen dört harf A, K, U, L puanın yeni değeri oluyor. Program çökmüyor, uyarı da vermiyor. %5s ile kod ilk beş harf olur, puan 100 kalır. Ekrandaki her çıktı, kodun gerçekten derlenip çalıştırılmasından geliyor. Bu derste: 1. Bir metin = karakterlerden oluşan dizi + sonlandırıcı '\0' (sizeof 8, lldb ile baytlar) 2. ASCII kodları: m = 0x6d = 109, 'M' = 77; indisle erişim ve değiştirme 3. %s ilk 0 baytında durur; sonlandırıcıya kadar dolaşan döngü 4. Sonlandırıcı unutulursa: gcc ve clang farklı, tanımsız davranış 5. scanf ile kelime okumak: %19s, & yok; genişliksiz okuma komşu değişkeni bozar Bölümler: 0:00 Metin = karakter dizisi 0:18 7 harf, kaç bayt? 0:35 Fazladan bayt: sonlandırıcı 1:15 Tek tek karakterlerle 1:37 Karakterlere indisle erişmek 2:14 Sonlandırıcıya kadar 2:44 Sonlandırıcı unutulursa 3:18 Klavyeden bir kelime 3:45 Genişlik vermezsek 4:29 Bugünün dört kuralı 4:50 Sonraki ders: statik diziler ve fonksiyonlar Kaynak kitap: Paul Deitel, Harvey Deitel — C How to Program, 9. baskı (2022), §6.5. Konu sırası ve kavramlar kaynak kitaptan izlenir; anlatım, örnekler ve ekranlar özgündür. Hedef kitle: C'ye yeni başlayan tüm mühendislik ve bilgisayar/yazılım öğrencileri. Ön koşul: C Programlama #01–#23.
Bu videoyu izlemek için Premium üyelik gerekir.