KARAKTER ��LEME

Tan�mlamalar ve Kullan�m     Giri� Fonksiyonlar�

Bir�ok program say�lar�n yan� s�ra metinler �zerine i�lem yapar. �lk akla gelen bir kelime i�lem program�d�r. Bu t�r bir programda metinlerle ilgili olarak, araya karakter girme, silme, de�i�tirme ve arama gibi i�lemler tan�ml�d�r. C dilindeki char tipi bu t�r verilerin saklanmas� i�in kullan�l�r.

1. Tan�mlamalar ve Kullan�m

karakter: Bilgisayarda tan�ml� herhangi bir ��eyi g�sterir. Karakter sabitler tek t�rnak i�inde belirtilir.

'A', '0', '\65' : \ i�aretinin ard�ndan belirtilen ASCII kodlu karakter.

C dili karakterleri ayr�ca int de�er gibi de g�r�r. 'A' karakteri say�sal olarak A harfinin ASCII tablosundaki kar��l��� olan 65 olarak da yorumlanabilir.

dizi (string): Bir dizi karakterden olu�ur. '\0' karakteri dizinin sonunu g�sterir. Dizi sabitler �ift t�rnak i�inde g�sterilir.

"AL�", "Bir say� girin" Bu ifadede C dili \0 karakterini otomatik koyar.

Karakter ile dizi birbirinden farkl� �eylerdir. Dizinin 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 dizi olup A ve \0 karakterlerini i�erir.

Tan�mlama bi�imi:

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 */

Pointer olarak tan�mlama

char *de�i�ken;

char *a;

Do�rudan De�er Atama

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.

Dizi bi�iminde tan�ml� diziye sabit bir dizi atama i�in strcpy fonksiyonu kullan�l�r.

strcpy(char *hedef, const char *kaynak); kaynak bilgisini hedef de�i�kenine kopyalar (string.h)

Hedef dizisinde kaynak dizisini i�erecek kadar yer olmal�d�r.

strcpy(a, "AL�");

b = "AL�"; /* �ift t�rnak i�inde atanacak de�er . \0 karakteri otomatik eklenir */

De�erini Yazd�rma

printf("%s", a);

puts(a); sonu \0 ile biten karakter dizisini ekrana yazar ve imle�i alt sat�ra ge�irir ( stdio.h )

Klavyeden De�er Atama

scanf("%s", a); /* Bo�luk karakterine kadar okuma yapaca�� i�in i�erisinde bu karakterin ge�mesi olas� giri�lerde do�ru �al��maz. Adres operat�r� kullan�lm�yor */

gets(a) ; Sat�r sonu karakterine kadar (ENTER tu�u) bas�lan karakterleri okur ( stdio.h )

 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 */

strlen ( char *) : G�nderilen de�erin uzunlu�unu verir. (string.h)

�ki Dizinin Kar��la�t�r�lmas�

C dilinde diziler do�rudan kar��la�t�r�lamazlar. Her bir eleman�n� ayr� ayr� kar��la�t�r�lmal�d�r. K���kl�k-b�y�kl�k bilgisi ASCII tabloda �nce-sonra bulunma bilgisine �zde�tir. Kar��la�t�rma amac�yla

strcmp(dizi1, dizi2)

fonksiyonu kullan�l�r. Fonksiyon �� de�er al�r.

�rnek:

int main()

{

char *s1 = "aaa", *s2 = "aba;

int i;

i = strcmp(s1, s2);

if (i > 0)

printf("s1 b�y�k \n");

else if (i<0)

printf("s2 b�y�k\n");

else

printf("e�itler\n");

}

�ki Diziyi Toplama (ekleme)

Diziler ile ilgili di�er s�k kullan�lan fonksiyon strcat(hedef, kaynak) tir. kaynak dizisini hedef dizisine ekler.

Hedef dizisinde kaynak dizisini i�erecek kadar yer olmal�d�r.

atoi , atof, atol .. Fonksiyonlar�

Genellikle bir program�n ak��� boyunca baz� verilerin tiplerinin de�i�tirilmesi gerekir. Bu de�i�im string tipindeki bir de�i�kenin say�sal tipe d�n��t�r�lmesi veya tersi bi�iminde olabilir.

Say�sal string : ��eri�i C'nin say� g�sterimine uygun olan metin. '5.87' , '0.3E5' , '3423'

int atoi(char *s) : tamsay�ya d�n��t�r�r.

long int atol(char *s) : uzun tamsay�ya d�n��t�r�r.

double atof(char *s) : ger�el say�ya d�n��t�r�r.

Bu fonksiyonlar d�n��t�rme i�lemine s i�erisinde ge�ersiz bir karakter ile kar��la��ld���nda son verir. Ve bu noktaya kadar karakterlerin olu�turdu�u say�y� verir. �lk karakter ge�ersiz ise fonksiyonun de�eri tan�ms�zd�r. Ayn� fonksiyonlar�n biraz daha geli�mi�leri ise;

double strtod(const char *s, char **ss) :

long int strtol(const char *s, char **ss, int base) :

unsigned int strtol(const char *s, char **ss, int base) :

s : string bilgi

ss : s de�i�keninde ilk ge�ersiz karakter ve sonras�nda katar dizini g�sterir

base : d�n���m�n hangi tabana g�re yap�laca��n� belirtir.

 �rnek: atoi, atol, atof fonksiyonlarinin davran��lar�.

main()

{

char *s;

int i;

long x;

double f;

s="5";

printf("%d %ld %f\n",atoi(s),atol(s),atof(s));

s="5.4";

printf("%d %ld %f\n",atoi(s),atol(s),atof(s));

s="5.2e4=KL";

printf("%d %ld %f\n",atoi(s),atol(s),atof(s));

}

s de�eri ��kt�

5 5 5 5.000000

5 5 5 5.400000

5 5 5 52000.000000

2. Giri� Fonksiyonlar�

main()

{

char c1, c2;

char s[10];

clrscr();

c1 = getchar(); /* klavyeden ENTER tu�una bas�lana kadar tu� bekler */

/* cursor on, karakter yaz�l�r */

c2 = getchar(); /* klavyenin tamponundaki s�radakini okur */

printf("\n%c , %c\n",c1,c2);

c1 = getche(); /* tu� bas�lmas�n� bekler, ENTER beklenmez*/

/* cursor on, karakter yaz�l�r */

c2 = getche(); /* tu� bas�ld�ktan sonra kontrol bu sat�ra ge�er */

printf("\n%c , %c\n",c1,c2);

c1 = getch(); /* tu� bas�lmas�n� bekler, ENTER beklenmez */

/* cursor on, karakter yaz�lmaz x int putch(int c): c ekrana yaz�l�r*/

c2 = getch(); /* tu� bas�ld�ktan sonra kontrol bu sat�ra ge�er */

printf("\n%c , %c\n",c1,c2);

}

sprintf fonksiyonu : say�sal de�eri diziye d�n��t�rmek i�in kullan�labilir. Yap�s�;

sprintf( dizi, kontrol, de�i�kenler)

Kullan�m �ekli printf fonksiyonuna yak�nd�r. Kontrol ve de�i�ken bilgisine g�re ekrana yaz�lmas� gereken bilgi parametre olarak g�nderilen diziye kopyalan�r.

char *s;

int i = 57;

sprintf(s, "%d", i);

ifadesi sonunda s dizisinde "57" de�eri olu�ur.

float f = 2.1;

sprintf(s, "%f", f);

ifadesi sonunda s dizisinde "2.100000" de�eri olu�ur.

 �rnek: Bir dizi 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 j;

clrscr();

s1="ali zil �aldi";

strcpy(s2, s1);

for (j=0; j<strlen(s1); j++)

if (s1[j] == 'i')

s1[j] = '�';

printf("%s\n",s1);

char *strchr(char *s, char c) : s dizisi i�erisinde c karakterinin konumunu g�steren diziyi g�nderir.

�rnek kullan�m�:

while (strchr(s2, 'i') !=NULL) {

s3 = strchr(s2, 'i');

s3[0] = '�';

}

printf("%s\n",s2);

} gibidir.