STRİNG FONKSİYONLARI
String Stringler, char tipinde bildirilen karakter dizileridir ve harfler, rakamlar, veya bazı sembollerden oluşurlar. Genel olarak bir string bildirimi: char string_adı[eleman_sayısı];yada char *string_adı;şeklinde yapılır.
Scanf ve Printf printf() ve scanf() fonksiyonları diğer tiplerde olduğu gibi formatlı okuma/yazma amaçlı kullanılır.String formatı %s dir. Genellikle bir döngü içersinde, her dizi elemanı için scanf( ) veya printf( ) fonksiyonunu çağırmamız gerekiyordu. String için böyle bir mecburiyet bulunmuyor. Tek bir kelimeyi, tek bir scanf( ) fonksiyonuyla okutabilir ve elemanlara otomatik değer atayabilirsiniz.
Gets ve Puts puts() fonksiyonu bir karakter dizisini ekrana yazdırmak için kullanılır. Bu fonksiyon diziyi ekrana yazdırdıktan sonra imleci bir sonraki satıra geçirir. char *str = "Hangi cilgin bana zincir vuracakmis sasarim"; ... puts(str); gets( ) isminden anlayacağınız ( get string ) gibi stringe değer atamak için kullanılır. gets( ) atayacağı değerin ayrımını yapabilmek için '\n' aramaktadır. Yani klavyeden Enter'a basılana kadar girilen her şeyi, tek bir stringe atayacaktır.
Karakter Dizisi Diziler sadece sayısal değişkenlerde ve sayısal işlemlerde kullanılmazlar.Bir çok kez cümle vb. yapılarda aslında karakter dizileri kullanırız. Karakter dizileri normal bir dizi tanımlanıyormuş gibi tanımlanır sadece tür değimi char olarak seçilir. Bu karakter dizeleri ile ilgili bir takım işlemleri gerçekleştirmek için gerekli olabilecek fonksiyonlar "string.h" kütüphanesi içerisindedir. Eğer bir karakter dizisinin eleman sayısı belirtilmezse, başlangıçta bildirilen karakter sayısı kaç tane ise dizinin eleman sayısı o kadar olduğu varsayılır.
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.Sonlandırıcı karakter, karakter dizileri üzerinde işlemlerin hızlı ve etkin bir biçimde yapılabilmesine olanak sağlar.
Dizgi Bir dizi karakterden oluşur. '\0' karakteri dizginin sonunu gösterir.Dizgi sabitler çift tırnak içinde gösterilir. Bu ifadede dil \0 karakterini otomatik koyar. "ALİ", "Bir sayı girin" Karakter ile dizgi birbirinden farklı şeylerdir. Dizginin sonunda her zaman \0 karakteri vardır.'A' ile "A" birbirinin aynısı değildir. 'A' karakterini gösteren 65 değerinde bellekte int olarak saklanırken "A" ise bir dizgi olup A ve \0 karakterlerini içerir.
Tanımlama Biçimleri Dizi şeklinde tanımlama char a[7] = {'K','O',,'C','A','E','L','İ'}; char a[8] = "KOCAELİ"; /* Son eleman olrak \0 karakteri eklendiği için eleman sayısını bir fazla belirtmeli */
İşaretçi olarak tanımlama char *değişken; char *a; Değerini Yazdırma printf("%s", a); puts(a);
Değer Atama Tek bir kelimeyi, tek bir scanf( ) fonksiyonuyla okutabilir ve elemanlara otomatik değer atayabilirsiniz. Yani "Merhaba" şeklinde bir girdi-input gelirse, 3.dizi elemanı 'r' olurken; 6.dizi elemanı 'b' olur. Önceki dizilerde gördüğümüzün aksine, eleman atamaları kendiliğinden gerçekleşir. Stringlere değer atarken ya da stringlerden değer okurken, sadece string adını yazmanız yeterlidir. Yani scanf( ) fonksiyonu içersine & işareti koymamız gerekmiyor. Çünkü scanf( ), stringin ilk adresinden başlayarak aşağıya doğru harfleri tek tek ataması gerektiğini biliyor.
char a[20]; char *b; a[0] = 'A'; /* dizinin bir elemanına değer verir gibi ve tek tırnak içinde ( karakter sabiti) */ \0 karakteri ayrıca belirtilmelidir.
Karakter Dizisinin Herhangi Bir Karakterine Erişme Dizilerde olduğu gibi erişilmek istenen karakterin indisi bildirilir. a[2] = 'G'; b[2] = 'G'; a[4] = '\0'; printf("%c ", b[3]); /* b'nin 4. elemanını yazar */
string.h kütüphanesine ait bazı fonksiyonlar int strcmp(char *str1,char *str2);str1 ve str2 yi karşlaştırır. Eşitse 0, str1 büyükse 0'dan büyük bir değer aksi halde 0'dan küçük bir değer göderir. char *strcpy(char *str1, char*str2);str2 yi str1 e kopyalar. char *strcat(char *str1,char *str2);str2 yi str1 e ekler.
char *strrev(str);str yi ters çevirir. int strlen(str);str nin kaç karakterden oluştuğunu hesaplar. char *strstr(char *str1,char *str2);str2 katarının str1 içindeki (baştan itibaren) ilk karşılaştığı yeri verir. char *strlwr(char *str);str nin bütün karakterini küçük harfe çevirir. char *strupr(char *str);str nin bütün karakterini büyük harfe çevirir.
Örnekler #include <stdio.h> int main() { int i; char kelime[3]; kelime[0]= 'a'; kelime[1]= 'b'; kelima[2]= 'c'; for(i=0;i<3; i++) { printf("index %d : %c", i,kelime[i]); } return 0; }
Buradaki örneğimizde öncelikle 3 boyutunda bir string tanımladık. Ardından sırayla stringin elemanlarını doldurduk. Son olarakta bunları bir döngüyle kullanıcıya geri bastırdık.
Stringleri bu şekilde karakter karakter doldurmak çok yorucu bir iş. Bunun yerine biz gets() fonksiyonunu kullanacağız. Şimdiki örneğimizi gets fonksiyonu kullanarak yapalım.
#include <stdio.h> #include <string.h> main() { int i; char kelime[100]; printf("Bir kelime giriniz\n"); gets(kelime); printf("%s", kelime); return 0; }
Kodumuza bakacak olursak bir string tanımladık 100 boyutunda Kodumuza bakacak olursak bir string tanımladık 100 boyutunda. (En fazla 100 boyutunda bir kelime girilebilir). Gets fonksiyonunun kullanımı gördüğünüz gibi çok kolay. Sadece içine string ismini yollamak yeterli oluyor. Ardındansa stringimizi ekrana bastırdık. Bunun için geçen seferki gibi döngü kullanmadık , sadece tek bir printfle %s (string olduğunu belirtir) kullanarak bastırdık.
Bir string i farklı yöntemlerle ekrana yazdırılması #include <stdio.h> int main() { char dizi[7] = {'S', 'e', 'l', 'a', 'm', '!', '\0'}; int i; /* Herbir karakteri ayrı ayrı alt alta yaz */ printf("Dizi elemanlari:\n"); for (i=0; i<7; i++) printf("dizi[%d] icerigi: %c\n", i, dizi[i]); printf("\n"); /* 1. yöntem: her elemanı yanyana yaz */ printf( "Butun dizi (1.yontem): "); printf("%c", dizi[i]); /* 2. Yöntem: bütün diziyi yaz */ printf("\nButun dizi (2.yontem): "); printf("%s\n", dizi); return 0; }
Ç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!
Bir string içinde 'm' karakterinin sayısını öğrenme #include <stdio.h> int main() { char str[20]; int i, sayac=0; printf("Bir string girin: "); gets(str); for(i=0; str[i] != '\0'; i++) if( str[i] == 'm') sayac++; printf("'m' karakteri sayisi = %d\n",sayac); return 0;}
ÇIKTI Bir katar girin: marmara'm' karakteri sayisi = 2
Bir string yazdırma [/* Bir elemanları string olan karakter dizisini yazdırma */ ] #include <stdio.h> int main() { char *gun[7] = { "Pazartesi", "Sali", "Carsamba", "Persembe", "Cuma", "Cumartesi", "Pazar" }; int i; for(i=0; i<7; i++) printf("%d. %s\n",i+1,gun[i]); return 0;}
ÇIKTI 1. Pazartesi 2. Sali 3. Carsamba 4. Persembe 5. Cuma 6. Cumartesi 7. Pazar
strcmp fonksiyonunun kullanımı [Basit bir şifre programı strcmp fonksiyonunun kullanımı [Basit bir şifre programı. Kullanıcı en fazla 3 kez yanlış şifre ] int main() { char sifre[8]; int sonuc, hak=3; while( hak-- > 0 ) { printf("Sifre : "); gets(sifre); /* şifreyi al */ sonuc = strcmp(sifre,"elma%xj4"); if( sonuc==0 ) { /* şifre kontrol */ puts("sifre dogru"); break; } else puts("sifre yanlis"); } return 0;}
ÇIKTI Sifre : adminsifre yanlisSifre : rootsifre yanlisSifre : elma%xj4 sifre dogru
strcpy fonksiyonunun kullanımı [Bir string diğerine kopyalama ] #include <stdio.h> #include <string.h> int main() { char str1[] = "Deneme"; char str2[15], str3[15]; int i; /* strcpy kullanarak kopyalama */ strcpy(str2, str1); /* strcpy kullanmadan kopyalama */ for(i=0; str1[i]; i++) str3[i] = str1[i]; str3[i] = '\0'; /* sonlandırıcı ekle */ /* sonuçlar ekrana */ printf("str1 : %s\n",str1); printf("str2 : %s\n",str2); printf("str3 : %s\n",str3); return 0;}
ÇIKTI str1 : Deneme str2 : Deneme str3 : Deneme
strcat fonksiyonunun kullanımı Bir katarı diğerine ekler #include <stdio.h> #include <string.h> int main() { char mesaj[20] = "Selam "; /* 1. katar */ char isim[10]; /* 2. katar */ printf("Adiniz ? : "); scanf("%s",isim); /* ekle */ strcat(mesaj, isim); printf("%s\n",mesaj); return 0;}
ÇIKTI Adiniz ? : Derya Selam Derya
strlen fonksiyonunun kullanımı [Bir karakter dizisinin uzunluğunu bulur ] #include <stdio.h> #include <string.h> int main() { char s[20]; int k = 0; printf("Bir seyler yazin : "); scanf("%s",s); /* sonlandırıcı karaktere kadar */ while( s[k] != '\0' ) k++; puts("Dizinin uzunlugu"); printf("strlen kullanarak = %d\n",strlen(s)); printf("strlen kullanmadan = %d\n",k); return 0;}
ÇIKTI Bir seyler yazin : deneme stringi Dizinin uzunlugu strlen kullanarak = 14 strlen kullanmadan = 14
Isim sırlama [Kabarcık Sıralama (Bubble Sort) Algoritması ile isimleri alfabetik sırayla listeler ] #include <stdio.h> #include <string.h> #define n 5int main() { char isim[n][8] = { "Semra", "Mustafa", "Ceyhun", "Asli", "Leyla" }; char gecici[8]; int i,j,k; puts("Once:\n------"); for(i=0; i<n; i++) printf("%s\n",isim[i]); /* sırala */ for(k=0; k<n-1; k++) for(j=0; j<n-1; j++) if( strcmp(isim[j],isim[j+1]) > 0 ) /* isim[j]>isim[j+1] ? */ { strcpy(gecici ,isim[j]); strcpy(isim[j] ,isim[j+1]); strcpy(isim[j+1],gecici); } puts("\nSonra:\n------"); printf("%s\n",isim[i]); return 0;}
Once: ------ Semra Mustafa Ceyhun Asli Leyla Sonra: ------ Asli Ceyhun Leyla Mustafa Semra
strlen dengi bir fonksiyon: struzn [Bir katarın uzunluğunu bulan strlen dengi bir fonksiyon ] #include <stdio.h> #include <string.h> int struzn(char *); int main() { char *s; printf("Bir katar girin: "); gets(s); printf("Uzunlugu (struzn) : %d\n",struzn(s)); printf("Uzunlugu (strlen) : %d\n",strlen(s)); return 0;}/* bir karakter dizisinin uzunluğunu hesaplar */ int struzn(char *str){ int n = 0; while(str[n]) n++; return n;}
ÇIKTI Bir katargirin:Programlama Uzunlugu (struzn) : 11 Uzunlugu (strlen) : 11
strrev dengi bir fonksiyon: strcev [: Bir katarın tersini veren bir fonksiyon */ ] #include <stdio.h> #include <string.h> char *strcev(char *); int main(){ char s[50]; printf("Bir katar girin: "); scanf("%s",s); printf("Katar, s : %s\n",s); printf("Tersi, strcev(s) : %s\n",strcev(s)); return 0;}/* str katarını ters-yüz eder */ char *strcev(char *str){ int i,n; char gecici; n = strlen(str); for(i=0; i<n/2; i++) { gecici = str[i]; str[i] = str[n-i-1]; str[n-i-1] = gecici; } return str; /* geri dönüş değeri bir gösterici */}
ÇIKTI Bir katar girin: Programlama Katar, s : ProgramlamaTersi, strcev(s) : amalmargorP
Klavyeden enter tuşuna basılıncaya girilen bir ifadenin bir değişkende saklanmasını sağlayan bir program yazınız. #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char cumle[1024],ch; int s=0; ch=getc(stdin); while (ch!='\n'){ cumle[s]=ch; s++; } cumle[s]='\0'; // girilen ifadenin sonuna karakter dizesi sonu işaretini yerleştiriyoruz.// system("PAUSE"); return 0; -------------------------------------------------------------------------------------
Klavyeden girilmiş bir ifadenin uzunluğunu strlen fonksiyonu kullanmadan bulan programı yazınız. #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char cumle[1024]; int s=0; gets(cumle); while (cumle[s]!='\0')s++; printf("Uzunluk:%d\n",s); // girilen ifadenin sonuna kadar harfler sayılır.karakter dizesi sonu işaretini bulmaya çalışıyoruz system("PAUSE"); return 0; }
Klavyeden istenilen uzunlukta veya enter tuşuna basılıncaya kadar ifadelerin okunmasını sağlayan programı yazınız. #include <stdio.h> #include <stdlib.h> #define SAY 15 int main(int argc, char *argv[]) { char kelime[SAY]; int l; l=0; while((kelime[l]=getc(stdin))!='\n' && l<SAY) l++; if (l>=SAY) l=SAY-1; kelime[l]='\0'; system("PAUSE"); return 0; }
1. c = sıradaki karakteri oku 2. Eğer c boşluk ise 4. adıma git Girilen cümleyi oluşturan kelimelerin sadece ilk harflerini yazdıran program. 1. c = sıradaki karakteri oku 2. Eğer c boşluk ise 4. adıma git 3. Hiç karakter yazılmamış ise c'yi yaz. 4. Eğer son karakter ise dur aksi halde bir sonraki karakteri göster ve 1.adıma git. Yukarıdaki algoritmada çözümün en önemli noktası herhangi bir kelimenin ilk kara
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i; int yaz; /* 1/0 -> karakteri yaz/yazma */ char *s; clrscr(); gets(s); yaz = 1; for (i = 0; i<strlen(s); i++) if (s[i] == ' ') else if (yaz) { printf("%c", s[i]); yaz = 0; system("PAUSE"); return 0; }
String tipi bir değişkenin değerini tamsayısal tipe dönüştüren işlevi yazınız.(atoi (stdlib.h)) Girdi : Tamsayısal string Çıktı : Karşılık gelen sayı #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { int deger (char *); char *c; int i; c="93t54"; i=deger(c); printf("%s dizi katarının sayısal karşılığı %d \n",c, i); } int deger( char *s) int i,j; int x; /*sayı */ x = 0; for (i = 0; i<strlen(s); i++) { j = s[i] - '0'; x = x * 10 + j ; system("PAUSE"); return 0;
Bir dizgi içerisindeki bir karakterin bulunması Bir dizgi içerisindeki bir karakterin bulunması. i harfini İ ile değiştiren program. #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char *s1, *s2, *s3; int i; clrscr(); s1="ali zil çaldi"; strcpy(s2, s1); for (i=0; i<strlen(s1); i++) if (s1[i] == 'i') s1[i] = 'İ'; printf("%s\n",s1); system("PAUSE"); return 0; }
Bir dizgi içerisindeki bir karakterin bulunması Bir dizgi içerisindeki bir karakterin bulunması. i harfini İ ile değiştiren program. #include <string.h> #include <stdio.h> int main() { char *s1, *s2, *s3; int i; clrscr(); s1="ali zil çaldi"; strcpy(s2, s1); for (i=0; i<strlen(s1); i++) if (s1[i] == 'i') s1[i] = 'İ'; printf("%s\n",s1);
BİZİ DİNLEDİĞİNİZ İÇİN TEŞEKKÜR EDERİZ... DİDEM ÜZMEZ DERYA EDEBALİ