Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Kullanı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:

  1. Kullanıcının girişini saklamak için 30 elemanlı username adında bir karakter dizisi (character array) tanımlayın
  2. Başka bir girişi saklamak için 25 elemanlı hobby adında bir karakter dizisi tanımlayın
  3. Kullanıcıya "Enter your username:" mesajıyla komut vermek için printf kullanın
  4. Kullanıcı adını username dizisine okumak için %s format belirleyicisi ile scanf kullanın
  5. Kullanıcıya "Enter your hobby:" mesajıyla komut vermek için printf kullanın
  6. Hobiyi hobby dizisine okumak için %s format belirleyicisi ile scanf kullanın
  7. Her iki dizeyi de printf kullanarak 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;
}
quiz iconKendini test et

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