scanf ile String Girişi
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 14 / 63.
Dizelerin null sonlandırıcı ile nasıl çalıştığını anladığınıza göre, kullanıcılardan dize girişi almayı öğrenmenin zamanı geldi. scanf fonksiyonu, %s format belirleyicisini kullanarak dizeleri okuyabilir, ancak anlamanız gereken önemli sınırlamalarla birlikte gelir.
scanf ile bir dize okumak için %s formatını kullanırsınız ve karakter dizinizin adını (dizi adları zaten adres olduğu için & operatörü olmadan) geçirirsiniz:
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);Ancak, scanf("%s", ...) kritik bir kısıtlamaya sahiptir: herhangi bir boşluk karakteriyle (boşluk, sekme veya yeni satır) karşılaştığı anda okumayı durdurur. Bu, bir kullanıcı "Hello World" yazarsa, scanf fonksiyonunun sadece "Hello" kısmını yakalayacağı ve "World" kısmını giriş tamponunda bırakacağı anlamına gelir.
Bir başka ciddi sorun da, scanf fonksiyonunun girdinin dizinize sığıp sığmadığını kontrol etmemesidir. Eğer birisi dizinizin kapasitesinden daha uzun bir kelime girerse, bu durum bir bellek taşmasına (buffer overflow) yol açarak potansiyel olarak programınızın çökmesine veya güvenlik açıklarının oluşmasına neden olabilir. Karakter dizinizin beklenen girdi için yeterince büyük olduğundan her zaman emin olun.
Bu sınırlamalara rağmen, scanf("%s", ...) tek kelimeleri okumak için tamamen uygundur; bu da tam olarak yaklaşan meydan okumada pratik yapacağınız şeydir.
Görev
KolayKullanıcıdan scanf kullanarak dize (string) girişi almayı ve bunu geri görüntülemeyi gösteren bir C programı yazın. Programınız şunları yapmalıdır:
- Kullanıcının girişini saklamak için 30 elemanlı
usernameadında bir karakter dizisi (character array) tanımlayın - Başka bir girişi saklamak için 25 elemanlı
hobbyadında bir karakter dizisi tanımlayın - Kullanıcıya "Enter your username:" mesajıyla komut vermek için
printfkullanın - Kullanıcı adını
usernamedizisine okumak için%sformat belirleyicisi ilescanfkullanın - Kullanıcıya "Enter your hobby:" mesajıyla komut vermek için
printfkullanın - Hobiyi
hobbydizisine okumak için%sformat belirleyicisi ilescanfkullanın - Her iki dizeyi de
printfkullanarak aşağıda gösterilen tam formatta yazdırın
Giriş, iki ayrı tek kelime olarak sağlanacaktır (her kelime içinde boşluk olmayacaktır).
Çıktınız sonuçları aşağıdaki formatta görüntülemelidir:
Enter your username:
Enter your hobby:
Hello [username], your hobby is [hobby]!Örneğin, kullanıcı kullanıcı adı olarak "Alice" ve hobi olarak "reading" girerse, çıktı şöyle olmalıdır:
Enter your username:
Enter your hobby:
Hello Alice, your hobby is reading!Bu meydan okuma, dize girişini okumak için %s format belirleyicisi ile scanf kullanımını, yeterli boyutta uygun karakter dizisi tanımlamayı ve kullanıcı girişini printf kullanarak formatlanmış çıktı ile birleştirmeyi anlama düzeyinizi test eder.
Kopya kağıdı
Kullanıcılardan dize (string) girişi okumak için, %s format belirleyicisi ile scanf kullanın:
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);scanf("%s", ...) fonksiyonunun önemli sınırlamaları:
- Herhangi bir boşluk karakterinde (boşluk, tab, yeni satır) okumayı durdurur
- Yalnızca tek kelimeleri yakalar - "Hello World" sadece "Hello" olur
- Tampon taşması (buffer overflow) koruması yoktur - dizinizin yeterince büyük olduğundan emin olun
- Dizi adlarıyla
&operatörünü kullanmayın (onlar zaten adrestir)
Kendin dene
#include <stdio.h>
int main() {
// YAPILACAK: Karakter dizilerinizi burada tanımlayın
// YAPILACAK: Giriş istemek ve okumak için kodunuzu buraya yazın
// YAPILACAK: Nihai çıktı mesajını yazdırın
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Logic & Flow bölümündeki tüm dersler
1Pointer Temelleri
Pointer Nedir?Pointer TanımlamaAdres Operatörü (&)Dereference Operatörü (*)NULL Pointer'larÖzet: Pointer Temelleri4Proje: Basit Metin Aracı
Projeye Genel BakışKarakter Sayma2İşaretçiler ve Diziler
İşaretçi Olarak Dizi İsimleriDizi Elemanları - İşaretçilerİşaretçi Aritmetiğiİşaretçilerin KarşılaştırılmasıÖzet: İşaretçi ile Dizi Gezinme5İşaretçiler ve Fonksiyonlar
Değer ile GeçmeFonksiyonlara İşaretçi Göndermeİşaretçiler ile Değişkenleri DeğiştirmeKlasik Bir Örnek: SwapFonksiyonlara Dizi GöndermeÖzet: Fonksiyon İşaretçi Argümanları8Yapılar ve İşaretçiler
Yapılara İşaretçilerOk Operatörü (->)Yapıları Değer ile AktarmaYapı İşaretçilerini AktarmaYapıların Dinamik TahsisiÖzet: Yapıyı Değiştirme - Ptr11Son Tekrar Görevleri
Tekrar: Dinamik String BirleştirmeTekrar: Struct DizisiTekrar: Kelime Frekans Sayacı3Karakter Dizileri ve Stringler
char Dizisi Olarak StringlerNull Sonlandırıcıscanf ile String Girişistrlen() Kullanımıstrcpy() Kullanımıstrcat() Kullanımıstrcmp() KullanımıÖzet: Temel String Fonksiyonları