Papatyam Forum - Tekil Mesaj gösterimi - C Dökümanları
Konu Başlıkları: C Dökümanları
Tekil Mesaj gösterimi
Alt 20 January 2009, 14:49   Mesaj No:3

CoNQueRoR_61

Papatyam Usta Üyesi
Avatar Otomotik
Durumu:CoNQueRoR_61 isimli Üye şimdilik offline konumundadır
Papatyam No : 1397
Üyelik T.: 20 January 2009
Arkadaşları:0
Cinsiyet:
Memleket:istanbul
Yaş:35
Mesaj: 131
Konular:
Beğenildi:
Beğendi:
Takdirleri:10
Takdir Et:
Konu Bu  Üyemize Aittir!
Standart Ynt: C Dökümanları

Temel C Dokümanları 4 (Stringler)

Geçen dersimizde arrayleri gorduk... Artık string lerle ugrasabiliriz. Daha once degisken turlerinden bahsetmistik. Programlarımızda int, double, float gibi sayı tutan degiskenlerden bahsettik ve bunların dizilerde kullanıslarını gorduk. Ama daha once adını verdigimiz char degisken turunden pek bahsetmedik. Hatırlarsak char harfleri tutan bir degiskendi. C de bir kelimeyi yada cumleyi taşıyan bir degisken turu yok. Ve bizi de programlarımızda harflerden cok kelimeler ve cumleler ilgilendirecek. Peki nasıl ustesinden gelecez bu kelime ve cumlelerin ? char turunde yani harf taşıyan diziler kullanarak. Bu tur dizilere C de string deniyor. Yani string kelime ve/veya kelimelerden olusan cumlelere deniyor... Simdi mesela programımızın radres kelimesini aklında tutmasını ve bu kelimeye gerekli değişiklikleri yapmasını istiyoruz.Bunun icin char arrayi kullanacaz... bir int arrayı nasıl yapıyorduk hatırlayalım.

int A[6];

A adında 6 tane tamsayı taşıyabilecek olan bir dizi yaptık...char arrayini de su sekilde yapacaz.

char A[6];

Burda da 6 tane harf tutabilen bir array yapmıs olduk. Simdi ben bu array'ın elemanlarına sırayla radres in harflerini atarsam bu kelimeyi basarıyla programımıza depolatmıs oluruz...

Su sekilde:

A[0]='r';

A[1]='a';

A[2]='d';

A[3]='r';

A[4]='e';

A[5]='s';

A[6]='\0'

Burda dikkat edilecek iki nokta var.

Birincisi = den sona harfleri atarken ' ' isaretlerini kullandık. char turunde bir degiskene deger atarken bu sekilde yapıyoruz. Eger A[0]=r diye yassaydık program “r” nin bir degişken oldugunu sanacaktı. Halbuki r diye bir degişkenimiz yok. Burada r sadece bir harf bunu belirtmek icin 'r' seklinde yazıyoruz.

İkincisi ise A[6]='\0' da kullandıgımız \0 isareti... Burda \ ile ozel bir karakter kullandıgımızı belirtiyoruz. Hatırlarsanız printf in icinde de \n diye bir şey kullanmıstık bu alt satıra geç demek oluyordu. \0 ise A stringimizin( yani A char arrayimizin ) sonuna geldigimizi yani kelimemizin yada cumlemizin bittigini anlatıyor.Her stringin son elemanı \0 dır. Ancak bu isareti gordugu zaman program stringimizin sonuna geldigimizi anlar.

Yukardaki kodlarda bir string yapmanın çok zahmetli oldugunu goruyorsunuz. Tek tek butun elemanları yani harfleri yazdık. Bunu yapmanın daha kolay bir yolu var tabiki... Ben acıklayıcı olması icin boyle yaptım. Normalde bir string oluşturmak için şoyle bir kod kullanılır.

A [] = "radres";

Burdaki tek satırda daha once yaptıgımız uzun işin tam olarak aynısı compiler tarafından yapılır. Burda da dikkat edilecek iki şey var.

Birincisi [ ] lerin içini bos bıraktık. Yani arrayimizin sınırlarını belirlemedik. Aslında dizileri bir şeye eşitlemeden kaç elemanlı oldugunu belirlemezsek compiler hata verir. Ama bu komutta gene compiler bizim yerimize stringimizin kaç harfden olustugunu sayıp arrayimizin sınırları belirliyor.Ve son elemana \0 karakterini gene kendisi atıyor.

İkinci dikkat edilecek şey ise " " isaretleri. String belirlerken tırnak işaterleri kullanıyoruz. Harf ve karakter belirlerken ise ' ' isaretlerini... Bunlar karıştırılmasın....

Simdi elimizde bir stringimiz var ve biz bunu istedigimiz gibi değistirebiliriz. mesela bu stringin 3. harfden sonrasını silelim...

A[3]='\0';

Bu komutla bu işi yaptık bile... A[3] r harfi idi, artık \0 karakteri oldu. Bundan sonra A stringini ver bize dedigimizde program, 3. elemandan sonraki elemanın yani A[3], yani dorduncu elemanın \0 oldugunu gorecek ve gerisini okumayacak. Bize sadece “rad” kısmını verecek. Şimdi de ilk elemanın baş harfini buyuk yapalım..

A[0]='R';

Bu komuttan sonra stringimiz Rad oldu...( unutmayın C buyuk harf kucuk harf ayrımı yapar. Asla R ile r aynı sey degildir.)

Peki biz bu stringleri programa input olarak nasıl okuturuz

? Yada output olarak nasıl verdiririz.

Output:

printf("%s",A);

Bu komut ekrana direk Rad yazar... Burda " " lerin icinde %s kullandık. Cunku A bir stringdir. int turunde bir degisken yazdırırken %d kullanıyorduk. String için de %s kullanacaz...

Eger stringimizin sadece ilk harfini yazdırmak isteseydik şu komutu kullanacaktık..

printf("%c",A[0]);

Bu komutun cıktısı sadece R olacaktır. Bu sefer " " lerin içine %c yazdık, % c char turunde bir cıktı alacagımızı soyluyor. Cunku A[0] bir harftir. Burada kafalar karışmasın. A stringdir. A'nın elemanları ise mesela A[0] bir harftir, char turundedir...

Input:

scanf("%s",A);

printf in tıpkısının aynısı scanf in daha onceki kullanımlarında degiskenden once & isaretini koyuyorduk. String okuturken ise bu isareti kullanmıyoruz. Bunun sebebi çok derin bir konu ileride pointerlar dokümanında anlayacaksınız...

Yukardaki komutun olduğu bir program da ekrana “radres” yazar enter a basarsanız A direk “radres”i alır gerekli şekilde depolar. Ama bu sefer A nın sınırlarını daha onceden belirlememiz gerekecek.

Simdi yukarda yazdıgımız kodları birleştirip basit bir program yapalım:

#include<stdio.h>

main()

{

char A[10];

scanf("%s",A);

A[3]='\0';

A[0]='R';

printf("%s",A);

return 0;

}


Bu programı calıştırıp “radre”s yazar ve entera basarsanız. Ekrana Rad yazacak...

Stringlerde input ve output larla ugrasmak icin printf ve scanfden daha kolay kullanımları olan komutlar var onlardan da haberdar edeyim sizi.

puts ve gets komutları:

printf("%s",A) yerine puts(A) yazarsak aynı işi gorür.

scanf("%s",A) yerine de gets(A) yazmak aynı şey değil. Bir fakı var. gets tüm satırı okurken scanf tüm satırı değil ilk kelimeyi okur. Çünkü scanf her boşluktan sonra gelen şeyi başka bir input olarak alır. gets ise her satırı bir input olarak gorür.

gets(A); kullanılan bir programda ekrana “Rad radres yazarsanız A[]="Rad radres" olur. Ama scanf kullanırsanız A[]="Rad" olur. Bu farkı da aklımızdan cıkarmayalım...

Simdi bu ogrendiklerimizi ve onceki bildiklerimizi kullanarak bir program yazacam bunu compile edip calıstırın programın ne yaptıgını ve mantıgını anlamaya calışın...

#include<stdio.h>

main()

{

char S[250], buf[250];

int string_uzunlugu,i,j;

gets(S);

i=0;

while(S != '\0')

{

i++;

}

string_uzunlugu=i;

i=i-1;

for(j=0; j<string_uzunlugu; j++)

{

buf[j]=S;

i=i-1;

}

buf[string_uzunlugu]='\0';

puts(buf);

return 0;

}


Bu dersin ödevi: bu programı compile edip calıstırın input olarak “radres” yazıp enter'a basın. Bakalım program output olarak ne verecek. Kodları iyice inceleyip nasıl calıştıgını, mantıgını ogrenin.Sonra bakmadan programı kendiniz tekrar yazmayı deneyin... input olarak radres den başka değisik şeyler de deneyin...
__________________
Biz Bu Hallere Düşecek Adammıydık ???
Alıntı ile Cevapla