Yanlış anlamadıysam 10. sorunun cevabı: #include <iostream> |
Arkadaşlar C ile uğraşıyorum.Değişken tiplerini felan öğrendikten sonra printf ile ekrana farklı şekillerde yazma işlemleri yapıyorum.(Biliyorum çok basitçe![]() C'de char,int,long,double,float gibi değişken türü dışında bir değişken türü yok başlangıçta sanırsam?Cümleleri tutmak için c#'daki gibi bir string değişken türü yok mu acaba?Ya da ileri seviyelerde mi? |
Hocam benimde çok detaylı C bilgim yok fakat C'de string tarzı ifadeler kullanmak için char dizisini oluşturuluyor sanırım bu şekilde; char deneme[] = "Deneme birkiuc"; |
Dizi ile denemiştim ama ben parantezleri C#'daki gibi değişken türünün yanına koyunca hata vermişti.Sağolasın hocam![]() |
Rica ederim hocam, ne demek. Yardımcı olabilmiş isem ne mutlu bana. |
Ama onu string türü olarak düşünme sakın. C' de string diye bir tür olmadığı için string tutan bir değişken de olmaz. Yani c' de "merhaba " + "dünya" = "merhaba dünya" değildir. Peki nedir dersen cevabı pointer konusunda saklı. |
String olarak düşünmedim hocam zaten ama derleyicide string gibi ifadeler mevcut neden bu şekilde bir değişken yok anlam veremedim.O konuya gelince öğreneceğiz artık![]() |
Atom olarak iki tırnak ("//") arasındaki herşey stringtir ve tek bir atomdur.(derleyicide gördüğünüz budur kuvvetle muhtemel) Ama değişken olarak string C de yok. Diğer dillerde de zaten doğal tür değil.(int, double gibi) Standart string sınıfı yazılmış, ona göre implemente ediliyor.. İhtiyacım olmadığı hiç bakmadım ama C de de aynı şekilde string kütüphaneleri ve fonksiyonları yazılmıştır mutlaka. C de char *cptr = "DonanimHaber"; // iki tırnak arasındaki donanimhaber stringtir. yazıldığında derleyici belleğin uygun yerine "DonanimHaber" yazar, aslında olan char [13] = "DonanimHaber"; Dikkat ederseniz dizinin ismi yok. Anonymous bir dizi yaratılır ve onun adresi cptr ye atanır. Artık string read-only dir.(Neden read-only olduğu ayrı bir konu) Stringi değiştirmeye çalışmak undefined behaviour dur. |
C çalıştığım kitapta bahsettiğiniz şekilde örnek verilmiş fakat ben ekrana yazdıramadığım için pek üstünde durmadım.Fakat dediğiniz gibi saçma aslında neden değiştirilemiyor ki sonrasında. Ayrıca printf ile belirttiğiniz şekilde bir karakter topluluğunu nasıl ekrana yazdırabiliriz? |
Sorularınızın hepsini tam anlamadım, neden değiştirmenin undefined behaviour olduğunu anlatayım. Aynı string lerin aynı adrestemi tutulacağı yoksa farklı adreslerde mi tutulacağı derleyici yazanların seçeneğine bırakılmış.(unspecified behaviour) Yukardaki mesajımda stringin nasıl oluşturulduğunu anlatmıştım. Aşağıdaki kodda 2 tane "DonanımHaber" stringinin adreslerini tutan değişkenlerin tuttukları adres aynı ya da farklı olabilir. (Genelde aynı olur) char *cptr1 = "DonanimHaber"; char *cptr2 = "DonanimHaber"; Hatta char *cptr3 = "Haber"; Buradaki "Haber" stringinin adresi (derleyiciden derleyiciye değişmekle birlikte) yukarıdaki cptr1 ve cptr2 nin içindeki "Haber" yazısının başlangıç adresidir. Şimdi cptr1[8] = 'X'; yapmak sadece birinci string de mi değişiklik yapacak yoksa 3 ünü birden mi değiştirecek? Buradaki derleyicinin seçimine bırakılan işleme unspecified behaviour deniliyor. Yani unspecified behaviour, undefined behaviour ı doğurmuş oluyor. Farklı bir örnek char *cptr1 = "DonanimHaber"; cptr1[8] = 'X'; printf("DonanimHaber"); Stringler statik ömürlü ve daha main çağrılmadan hayata geldikleri için printf in ne yazdıracağını bilemezsiniz.(Zaten undefined behaviour dır) Umarım anlatabilmişimdir. |
Anladım hocam.Peki C#'taki gibi String sınıfı ile işlemler yapabiliyor muyuz? misal kullanıcının girdiği bir metini scanf ile ne türden bir değişkene nasıl atabiliriz? (Sadece char ile dizi oluşturarak mı mümkündür?) |
Evet. (Bu arada C# ın adı geçtiği için, söyleyeyim stringi değiştirmek bildiğim kadarıyla C++, Java ve C# ta da undefined behaviour) char * ile yapmanız için dinamik bellek kullanmanız gerekir, orayı es geçiyorum. char c[100]; 1-) scanf("%s", c); ile alabilirsiniz, ama scanf in tamponlama mekanizması yüzünden boşluk bırakırsanız, boşluğa kadar olan kısmı alır. (Ya da white space karakterleri demek daha doğru) 2-) gets(c); ile alabilirsiniz ama 100 karakterlik diziye 120 karakter girebilirsiniz bu da run-time hatasını doğurur. Yani koruma mekanizması yok. 3-) fgets(c, 100, stdin); nihayet güvenli bir şekilde stringlerinizi alabilirsiniz.(99 karakter) Not: Yamulmuyorsam C ve C++11 standartlarında gets i kaldırmışlar. |
Konuyla alakasız olacak ancak cevaplarsanız sevinirim.. Şu an hazırlıktayım ve Ocakta bölüme başlama ihtimalim var ancak bu durumda Java ve C-C++ derslerini aynı anda görmek zorunda kalacağım..Yani hiç temel yokken hem 2. dönemin C-C++ derslerini hem ilk dönemin java derslerini alacağım zor olur mu?Java bilmeden C-C++ öğrenmek zor olur mu?Önceden çalışmaya gerek var mıdır?Önceden çalışmak için önerebileceğiniz kaynak var mıdır? |
Ukalalık etmek istemem ama bildiğim kadarıyla yanlış olan şeyler yazmışsınız. C' de stringler read-only değildir. "DonanimHaber" gibi bir stringin değiştirilemez olmasının sebebi derleyicinin bellekten kazanmak için stringi program koduna gömmesi. Bu stringi değiştirmeye çalışmak program kodunu değiştirmeye çalışmak anlamına gelir ve seg-fault yersiniz. Bir char dizisi tanımlarken; char str[] = "DonanimHaber"; ifadesindeki stringi derleyici str nin gösterdiği yere yazar çünkü bilir ki str dizisi değişkendir ve içeriği değişebilmelidir. Fakat; const char str[] = ... ya da const char *str = ... gibi bir bildirimde string code segmente yazılır çünkü değişmeyecek olan bir verinin bellekte yer kaplamasına gerek yoktur. Bu arada c++ ta da stringler aynı mantıkla çalışır. const olmayanlar istenildiği gibi modifiye edilebilir. |
Estağfurullah. Siz yanlış anladınız ya da ben eksik yazdım. Stringlerden kastımı biraz daraltıp anlattım, örneklerde görüldüğü gibi char *cptr = "DonanimHaber"; gibi stringlerdi. Doğrudan diziye atanan string ler tabiki değiştirilebilir. char c[] = "DonanimHaber"; gibi. Stringlerin program koduna gömüldüğünü de okumuştum ama yukarıdaki anlattığım undefined behaviour durumundan kesinlikle eminim. (Zaten kesin bilmediğim yerlerde özellikle belirtiyorum) Sonuç olarak sizin yazdığınız "char str[] = "DonanimHaber"; ifadesindeki stringi derleyici str nin gösterdiği yere yazar çünkü bilir ki str dizisi değişkendir ve içeriği değişebilmelidir." Buna zaten katılıyorum tersini de yazmadım. Bahsettiğim, char *str = "DonanimHaber"; in değiştirilmesinin undefined behaviour olduğuydu. (Hepsini yazayım da karışıklık kalmasın) const char *str = "DonanimHaber"; bunu zaten değiştirmeye kalkmak compile-time hatası. char str[] = "DonanimHaber"; istenilen şekilde değiştirilebilir. const char str[] = "DonanimHaber"; değiştirilemez const keyword ünden dolayı. Not: Belki gözünüzden kaçmıştır üstte birkaç mesaj daha var, onlara da bakabilirsiniz. |
Olsun tartışmak iyidir. Burada yazılanlar konuyla ilgili türkçe kaynaktır aynı zamanda.![]() Önemli birşeyi belirtmeyi unuttum. char *str = "DonanimHaber"; komple hatalı bir ifade. Normalde bunun derlenmemesi lazım ama ne hikmetse gcc bunu warning bile vermeden derliyor. Yaptığı şey ise şu. Stringi program koduna yazıp adresini str ye atıyor. str const olmadığı için str[0] = 'A'; ataması da yasak değil. Ama sonuçta malum sebepten çakılıyor. Kısacası bu bildirim şeklini kullanmayın. Zaten kimse tavsiye etmiyor. |
Derlenmemesi için dilin kuralları açısından bir engel yok ki, mantıksal bir hata. Adresi ataması da tamam. str[0] = 'A'; ataması derleme zamanında hata değil, evet. Kullanılmaması gerekir, const belirteci yazılmalıdır başına okunabilirlik olarak. Ama verdiğim cevaplar dilin kuralları dahilinde olan cevaplardı, aynı şeyleri söylüyoruz. Sadece son mesajımı okuduğunuzdan şüpheleniyorum ![]() |
Okudum. Size karşı yazılmış birşey değil zaten o. Sadece önceki mesajımda unuttuğum şeyi ek olarak yazdım. Uykum geldi ve biraz daha konuşursam saçmalamaya başlayacam.![]() İyi geceler. |
@4kalan Teşekkürler hocam. Bu arada üslubune uygun bir şekilde tartışmak iyidir ![]() @elektro_gadget yine sen iyisin hocam benim 10'dan sonra beyin off moduna geçiyor ![]() Bu arada C programlamayı CodeBlocks ile yapıyorum.String ifadeler içerisindeki türkçe karkaterleri göstermiyor ![]() |
Şimdi Program Üç Ana Öğeden Oluşuyor.
.Fatura Ekle(Tip Ve Kuruma Göre(Dinamik) Fatura Seçiyorum Abone Numarası,AdSoyad,Kayıt Tarihi Giriyorum Ve Faturayı KIaydediyorum.)
.Fatura Listele(Buı Kısımda Fatura Ekleden Gelen Bilgiler Doğrultusunda Faturayı Listeliyorum.Yalnız Listeleme Yaparken Şöyle Bir Kriterimiz Var Benim De Takıldığım Nokta Burası.Her Ay Ödenecek İşte Elektrik,Su,Telefon Faturaları Vardır Ya Ha Onlar Ben Hangi Ay Ve Yılı Seçersem Seçeyim Gelecek.Yani Ocak 2014'te Ocak'ta 5 Ayrı Fatura Girdim.Bu Faturalar Şubat,Mart,Nisan.. Hepsinde Listelenecek. Bir De Diyelim Şubat Ayı İçin Yeni Bir Doğalgaz Faturası Ekledim Bu Da Ocak'ta Gözükmeyecek Şubat,Mart,Nisan..Da Gözükecek. Ve Öde Dediğim Zaman Açılacan Form'a Fatura Numarasını Ve Tutarı Birde Ne Zaman Ödediğimi Girecem. Öde Kısnmından Glen Bu 3 Alan Ve Fatura Listeldeki Alanlardaki Verileri Gidip Fatura Hareket Tablosuna Yazacak. ) Ne Yaparsam Yapayım Bu İşi Yapamadım.
.Bu Aşamadada Faturaları Fatura Hareket Tablosunda Görüntüleyecek. Bi Kıstas Var Ay Ve Yıla Göre Mesela Ocak 2014 Te Ödenmen leri Ve Ödenmeyeleri Gösterecek Şubat,Mart,Nisan.. Diye.
< Bu mesaj bu kişi tarafından değiştirildi sametcafer61 -- 16 Kasım 2013; 21:47:21 >