+ Cevap Yaz
Toplam 3 sayfadan 3. sayfa
İlkİlk 1 2 3
27 sonuçtan 21 ile 27 arası gösteriliyor

Konu: Dizi yazdırma sorunları

  1. #21
    Ali Çehreli
    Üyelik Tarihi
    10/2002
    Mesaj
    2,901

    Alıntı _Onk@_, mesajından alıntı: Mesajı Gör
    Not: Standart C kütüphanesi gerçekten titiz çalışmalar sonucunda oluşturulmuştur. scanf'nin yanında (eşdeğer değiller dikkat ediniz) gets'in de sunulmasının mantıklı bir sebebi olduğu açıktır.
    Ne kadar titiz olursa olsun insanlar hata yaparlar. gets'in de tasarlandığı zaman mantıklı bir sebebi olduğundan eminim. Ama günümüzde kendi belgelerinde bile "bunu kullanmayın" denecek kadar güvensiz bir işlevdir.

    Tabii scanf de gets kadar güvensiz olarak kullanılabilir:

    Kod:
    scanf("%s", s);  // hata!
    
    s'te ne kadar yer olursa olsun, taşma olasılığı vardır.

    Scanf boşluk karakterinden sonraki karakterleri de alıyor mu? Önce bunun cevabını vermek gerekli.
    "Normalde" almaz. Ama %c ile alır:

    Kod:
    #include <stdio.h>
    
    int main()
    {
        char karakterler[100] = { 0 };
        int adet = 0;
    
        printf("Icinde bosluklar olabilen satir? ");
    
        /*
         * Bu duzen dizgisinin derleme zamaninda olusturulmasi mumkundur; icine
         * acikca 100 yazmak ayip ve hataya acik ama "giristen bosluklar
         * okuyabilme" ornegi ile ilgisiz...
         */
        scanf("%100c%n", karakterler, &adet);
        karakterler[adet - 1] = '\0';
    
        printf("%d karakter okudum: %s\n", adet, karakterler);
    }
    
    fflush(stdin);//Ali Hocam kızacak ama Düzgün çözüm yolunu unuttum, önerilmeyen çözüm.
    fflush'ın belgelerinde açıkça "çıkış akımları" ile ilgili olduğu yazar.

    Günümüzde genelde:
    stdin=tuş takımı;
    stdout=ekran, daha açık bir ifadeyle konsol ekranı;
    stderr=hataların yakalandığı akış diyebiliriz.
    Doğru ama günümüzde, günlük olarak, hatta her gün, standart çıkışı başka programalara da yönlendiriyoruz:

    grep birsey * | more

    Orada 'grep' programının standart çıkışı 'more' programının standart girişine bağlanır. Günde herhalde en az on kere kullanırım.

    Ali

  2. #22
    Ali Çehreli
    Üyelik Tarihi
    10/2002
    Mesaj
    2,901

    Alıntı openrlerv, mesajından alıntı: Mesajı Gör
    gets veriyi klavyeden,fgets ise dosyadan almıyor mu?
    _Onk@_'nın söylediğini tekrarlayacağım: ikisi de "akım"dan alır. fgets'e akımı biz söyleyebiliriz, gets stdin akımını kullanır.

    O zaman scanf kullanalım sadece.
    Olur.

    Bir de, gets hakkında söylediklerin belli bir karaktere kadar okuma kabiliyeti ile mi alakalı?
    gets nerede duracağını bilemez. Bunun nedeni, C'de (ve C++'da) dizilerin boylarının olmamasıdır. Diziler, yalnızca yan yana duran elemanlardırlar.

    gets'e veya herhangi başka bir işleve bir dizi gönderildiğinde; yalnızca o dizinin ilk elemanının adresi gider. Sanki gets'e "okuduğun karakterleri buradan başlayarak yaz" demişiz gibidir.

    Ama gets dizide ne kadar yer olduğunu öğrenecek bir parametreye sahip olmadığı için, girişten karakter geldikçe okur ve diziden sonraki yerlere de yazar. Kötü niyetli kullanıcılar da bundan yararlanarak program yığıtına kendi kodlarını yerleştirebilirler, vs.

    fgets'in üstünlüğü, dizide ne kadar yer olduğunu bizden öğrenmesidir. scanf'e de "%Ns" diye biz söyleyebiliriz... (N, yerin büyüklüğünü söyler.)

    Ali

  3. #23
    Üye
    Üyelik Tarihi
    01/2010
    Mesaj
    48

    O zaman klavye girişleri de dosya işlemleri olarak tanımlanmıştır gibi bir sonuca varabilir miyiz?

  4. #24
    Ali Çehreli
    Üyelik Tarihi
    10/2002
    Mesaj
    2,901

    "Klavye" değil; "standart giriş" dersek olur...

    Ve, her ne kadar "dosya" anlamına gelen FILE* dense de; aslında "akım" (stream) diye geçerler.

    C, klavyenin olmadığı ortamlarda da çalışabilecek kadar esnek bir dildir. Standart girişi klavyeye bağlayan, örneğin konsoldur.

    Ali

  5. #25
    Üye
    Üyelik Tarihi
    02/2010
    Mesaj
    11

    Alıntı acehreli, mesajından alıntı: Mesajı Gör
    Evet, C++'da kesinlikle std::vector.

    Ama openrlerv C öğreniyor ve zaten C'de dizi boyutu değişken olabilir.

    Ali
    int a[10]; seklinde tanimlanan bir dizi`nin boyutu degistirilemez.

    Dinamik bellek yonetimi ile bir pointer icin yeni bir alan tahsis edilebilir. Buda dizi degildir. Bence C` de dizi boyutu degisken olabilir ifadesi yanlis olmus.

  6. #26
    Üye
    Üyelik Tarihi
    10/2006
    Yer
    İstanbul
    Mesaj
    592

    Alıntı e_koca, mesajından alıntı: Mesajı Gör
    Bence C` de dizi boyutu degisken olabilir ifadesi yanlis olmus.
    C diyince benim aklima C89 geliyor ve bencede "C'de dizi boyutu degisken olabilir" pek dogru degil. C99 'da desek sanki saha dogru olmaz mi?

  7. #27
    Ali Çehreli
    Üyelik Tarihi
    10/2002
    Mesaj
    2,901

    Alıntı e_koca, mesajından alıntı: Mesajı Gör
    int a[10]; seklinde tanimlanan bir dizi`nin boyutu degistirilemez.

    Dinamik bellek yonetimi ile bir pointer icin yeni bir alan tahsis edilebilir. Buda dizi degildir. Bence C` de dizi boyutu degisken olabilir ifadesi yanlis olmus.
    Evet yanlış olmuş. Şöyle demek istemişim: dizi boyutu olarak değişken kullanılabilir.

    Onu, CrimeCoder'ın şu sözüne yanıt olarak yazmıştım:

    Alıntı CrimeCoder, mesajından alıntı:
    boyutunu verirken eğer boyutunu bir değişkenden vereceksek bu değişkenin const olma zorunluluğu
    Hata denetimini gözardı ederek bir örnek:

    Kod:
    #include <stdio.h>
    
    int main()
    {
        int uzunluk = 0;
        scanf("%d", &uzunluk);
    
        int dizi[uzunluk];  // <-- degisken
        dizi[0] = 42;
    }
    
    quasimodo, sen C'nin tanımı için 21 yıl önceye gidiyorsun; ben 11 yıl önceye.

    Ali

+ Cevap Yaz

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

     

Bookmarks

Mesaj Yazma Hakları

  • Yeni mesajgöndermezsiniz
  • Cevap yazamazsınız
  • Dosya ekleyemezsiniz
  • Mesajınızı düzenleyemezsiniz