Giriş Stringler anlaşılması en zor konulardan biridir. C programlama dilinde "iki tırnak içine alınan" her ifadeye string denir. Örneğin:
"Izmir"
"sonuc = %d\n"
"Devam etmek icin ENTER tusuna basin."
Türkçe yazılan C kitaplarda
string kelimesi yerine aşağıdaki ifadelerden biri karşılaşılabilir:
String = katar = karakter topluluğu = karakter dizisi
Bu bölümde stringlerin bildirimi, kullanılması ve işaretçilerle olan ilgisi konu edilecektir.
String Bildirimi Stringler, char tipinde bildirilen karakter dizileridir ve içeriği harfler, rakamlar, veya bazı sembolleri tutmak (saklamak) için kullanılır. C dilinde string bildirimi için bir tip deyimi yoktur. Bu yüzden, bir stringe bir dizi veya işaretçi gözüyle bakılır. Genel olarak bir stringin bildirimi:
char
string_adı[
eleman_sayısı];yada char *
string_adı;şeklinde yapılır. Örneğin bir öğrencinin isim bilgisi ad adlı bir stringle tutulmak istenirse:
char ad[10];yada char *ad;şeklinde programın başında bildirilmelidir.
Stringlere Başlangıç Değeri Atama Diğer dizi bildirimlerinde olduğu gibi, karakter dizilerine başlangıç değeri verilebilir. Örneğin aşağıda verilen iki bildirim aynı anlamdadır:
char s[5]={'I','z','m','i','r','\0'};
char s[5]="Izmir";
Birinci satırdaki bildirimde '\0' (NULL) sonlandırıcı karakter dizisinin sonlandığını gösterir. Daha önce de bahsedildiği gibi sonlandırıcı karakter, karakter dizileri üzerinde işlemlerin hızlı ve etkin bir biçimde yapılabilmesine olanak sağlar. İkinci bildirimde buna gerek yoktur.
Eğer bir karakter dizisinin kaç elemandan oluşacağı belirtilmezse, başlangıçta bildirilen karakter sayısı kaç tane ise dizinin eleman sayısı o kadar olduğu varsayılır.
char s[]="Ankara"; /* 6 elemanlı */
Eğer bildirim işaretçi ile yapılmak isterirse:
char *s="Ankara"; /* 6 elemanlı */
yada char *s;
...
s = "Ankara";
Ancak char s[6];
...
s = "Ankara";
şeklindeki bir atama geçersizdir. Çünkü bu şekilde yapılan bildirimde s bir değişken değil dizidir. Elemanları string olan diziler tanımlamak mümkündür. Örneğin en uzunu 7 karakter olan 5 farklı isim bir çatı altında şöyle toplanabilir:
char isim[5][8] = { "Semra", "Mustafa", "Ceyhun", "Asli", "Leyla" };
yada char isim[][8] = { "Semra", "Mustafa", "Ceyhun", "Asli", "Leyla" };
yada char *isim[5] = { "Semra", "Mustafa", "Ceyhun", "Asli", "Leyla" };
Görüldüğü gibi, bu tip tanımlamalarda birinci boyut (satır) dizinin eleman sayısını, ikinci boyut (sütun) her bir elemanın sahip olabileceği maksimum karakter sayısını gösterir.
NOT
String ifadelerinde doğrudan çift tırnak " veya ters bölü \ karakterleri kullanılamaz. Bu durumda string ifadeleri içerisinde
" yerine \"
\ yerine \\ kullanılmalıdır. Örneğin: char *mes = "\"ilk.c\" dosyasinin yeri:";
char *yol = "C:\\WINDOWS\\DESKTOP\\C";
...
puts(mes);
puts(yol);
ile ekrana aşağıdaki satırlar bastırlır: "ilk.c" dosyasinin yeri:
C:\WINDOWS\DESKTOP\C
String Üzerinde İşlem Yapan Standart G/Ç Fonksiyonları Daha önce klavyeden tek bir karakter alan ve ekarana yazan fonksiyonları incelemiştik. Şimdi ise aynı işlemi birden çok karakter için nasıl yapıldığı incelenecektir.
printf ve scanf fonksiyonları diğer tiplerde olduğu gibi formatlı okuma/yazma amaçlı kullanılır. String formatı %s dir. Örneğin:
char str[20];
...
scanf("%s",str);
printf("%s\n",str);
satırları ile klavyeden okunan stringin ilk 20 karakteri ekrana yazdırlabilir. Burada printf fonksiyonu:
printf(str);
şeklinde de kullanılabir. Bu durumda, string ekrana yazdırılır fakat imlec (cursor) bir alt satıra geçmez.
gets fonksiyonu klavyeden karakter dizisi almakta kullanılan bir C fonksiyonudur. Bu fonksiyon, klavyeden girilen karakterleri diziye yerleştirdikten sonra dizinin sonuna NULL karakterini koyar.
char str[20];
...
gets(str);
puts fonksiyonu bir karakter dizisini ekrana yazdırmak için kullanılır. Bu fonksiyon diziyi ekrana yazdırdıktan sonra imleci (cursor) bir sonraki satıra geçirir.
char str[20];
...
gets(str);
puts(str);
Dikkat edilirse puts(str) ile printf("%s\n",str) işlevsel olarak birbirine eşdeğerdir.
Buraya kadar anlatılanlar Program 11.1-3 de özetlenmiştir.
Program 11.1: Bir stringin farklı yöntemlerle ekrana yazdırılması
[color=gray] 1: /* 11prg01.c:
2: Bir karakter dizisinin farklı yöntemlerle ekrana yazılması */ 3: 4: #include <stdio>
5: 6: main()
7: {
8: char dizi[7] = {'S', 'e', 'l', 'a', 'm', '!', '\0'};
9: int i;
10: 11: /*--- Herbir karakteri ayrı ayrı alt alta yaz ---*/12: printf("Dizi elemanlari:\n");
13: for (i=0; i<7; i++)
14: printf("dizi[%d] icerigi: %c\n", i, dizi
);
15: printf("\n");
16:
17: /*--- 1. yöntem: her elemanı yanyana yaz ---*/
18: printf( "Butun dizi (1.yontem): ");
19: for (i=0; i<7> tcc 11prg01.c
C:\TC> 11prg02
$ gcc 11prg01.c -o 11prg01
$ ./11prg01
ÇIKTI
Dizi elemanlari:
dizi[0] icerigi: S
dizi[1] icerigi: e
dizi[2] icerigi: l
dizi[3] icerigi: a
dizi[4] icerigi: m
dizi[5] icerigi: !
dizi[6] icerigi:
Butun dizi (1.yontem): Selam!
Butun dizi (2.yontem): Selam!
Aşağıdaki program kalvyeden girilen bir stringin içindeki 'm' karakterlerinin sayısını blup ekrana yazar. İnceleyiniz.
Program 11.2: [i]Bir string içinde 'm' karakterinin sayısını öğrenme
[color=gray] 1: /* 11prg02.c: Bir stringin içindeki 'm' karakterlerinin sayısı hesaplar */ 2: 3: #include <stdio>
4: 5: void main(void)
6: {
7: char str[20];
8: int i,sayac=0;
9: 10: printf("Bir string girin: ");
11: gets(str);
12: 13: for(i=0;str
!='\0';i++)
14: if(str[i]=='m') sayac++;
15:
16: printf("'m' karakteri sayisi = %d\n",sayac);
17:
[color:3fb2=gray:3fb2]18: }
13. satırdaki döngüde , str[i]!='\0', koşulu ile sonlandırıcı karaktere gelinip gelinmedği sorgulanmaktadır. 14. satırda stringin içindeki 'm' karakterine rastlanırsa sayac değeri bir artmaktadır. String sonuna kadar bütün 'm' karakterlerinin toplamı hesaplanıp 16. satırda ekrana yazdırılmıştır.
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)
Linux
C:\TC> tcc 11prg02.c
C:\TC> 11prg02
$ gcc 11prg02.c -o 11prg02
$ ./11prg02
ÇIKTI
Bir string girin: marmara
'm' karakteri sayisi = 2
Program 11.2'deki döngü şöyle de yazılabilirdi:
...
for(i=0;str[i];i++)
if(str[i]=='m') sayac++;
...
Buradaki işlemle str[i] NULL karakterinden farklı olduğu sürece döngü devam ettirilmiştir.
Program 11.3: [i]Bir string dizisini yazdırma
[color=gray] 1: /* 11prg03.c: Bir string dizisini yazdırma */ 2: 3: #include <stdio>
4: 5: main()
6: {
7: char *gun[7] = { "Pazartesi", "Sali", "Carsamba",
8: "Persembe", "Cuma", "Cumartesi", "Pazar" };
9: int i;
10: 11: for(i=0;i<7> tcc 11prg03.c
C:\TC> 11prg03
$ gcc 11prg02.c -o 11prg03
$ ./11prg03
ÇIKTI
1. Pazartesi
2. Sali
3. Carsamba
4. Persembe
5. Cuma
6. Cumartesi
7. Pazar