📓
Temel C Programlama
  • Temel C Programlama Dersleri -1- Giriş
  • Temel C Programlama -2- Bilgisayar Mimarisi Temelleri
  • Temel C Programlama -3- Bilgisayar Yazılımı Temelleri
  • Temel C Programlama -4- Programlama Dilleri
  • Temel C Programlama -5- Makine Dili, Assembly Dili ve Yüksek Seviye Diller
  • Temel C Programlama -6- C Diline Giriş
  • Temel C Programlama -7- C Geliştirme Aşamaları ve Derleyici Kurulumu
  • Temel C Programlama -8- İlk Program
  • Temel C Programlama -9- Basit Program Örnekleri – 1
  • Temel C Programlama -10- Basit Program Örnekleri – 2
  • Temel C Programlama -11- Aritmetik Operatörler
  • Temel C Programlama -12- C Veri ve Değişken Tipleri
  • Temel C Programlama -13- C Veri ve Değişken Tipleri – 2
  • Temel C Programlama -14- Döngülere Giriş
  • Temel C Programlama -15- İlişki Operatörleri
  • Temel C Programlama -16- For Döngüsü
  • Temel C Programlama -17- While Döngüsü
  • Temel C Programlama -18- do while Döngüsü
  • Temel C Programlama -19- Kararlar ve If Karar Yapısı
  • Temel C Programlama -20- Else ve Else If Yapıları
  • Temel C Programlama -21- Switch Karar Yapısı, break ve continue
  • Temel C Programlama -22- Mantık Operatörleri, Birleşik Operatörler ve Operatör Önceliği
  • Temel C Programlama -23- Fonksiyonlara Giriş
  • Temel C Programlama -24- Basit Fonksiyonlar
  • Temel C Programlama -25- Değer Alan Fonksiyonlar, Sabitler, Önek ve Sonekler
  • Temel C Programlama -26- Fonksiyondan Değer Döndürmek
  • Temel C Programlama -27- Diğer Fonksiyon Konuları ve Recursive Fonksiyonlar
  • Temel C Programlama -28- Diziler
  • Temel C Programlama -29- Diziler -2-
  • Temel C Programlama -30- İşaretçilere Giriş
  • Temel C Programlama -31- İşaretçiler
  • Temel C Programlama -32- Çift İşaretçiler
  • Temel C Programlama -33- İşaretçileri Referans Olarak Aktarmak
  • Temel C Programlama -34- İşaretçi Aritmetiği
  • Temel C Programlama -35- İşaretçiler ve Diziler
  • Temel C Programlama -36- İşaretçi ve Değer Sabitleri
  • Temel C Programlama -37- Fonksiyon İşaretçileri
  • Temel C Programlama -38- Karakterler ve Karakter Dizilerine Giriş
  • Temel C Programlama -39- Karakter Dizileri (String)
  • Temel C Programlama -40- ctype.h Başlık Dosyası ile Karakter İşlemleri
  • Temel C Programlama -41- string.h Başlık Dosyası ile Karakter Dizisi İşlemleri
  • Temel C Programlama -42- stdlib.h ve stdio.h Başlık Dosyaları ile Karakter Dizisi İşlemleri
  • Temel C Programlama -43- Formatlı Giriş ve Çıkış
  • Temel C Programlama -44- Yapılar
  • Temel C Programlama -45- Yapı Uygulamaları ,typedef ve union (birlikler)
  • Temel C Programlama -46- Bit Manipülasyonu ve Bitwise Operatörleri
  • Temel C Programlama -47- Bit Bazlı Uygulamalar (Set, Reset, Toggle)
  • Temel C Programlama -48- Bit Alanları ve Enümeratörler
  • Temel C Programlama -49- Dosya İşlemleri ve fopen() fonksiyonu
  • Temel C Programlama -50- fprintf() ve fclose() ile En Basit Dosya Uygulaması
  • Temel C Programlama -51- Dosya İşaretçisi ve feof() Fonksiyonu
  • Temel C Programlama -52- Dosya Uygulamaları
  • Temel C Programlama -53- Ön İşlemci Komutları (Preprocessor)
  • Temel C Programlama -54- Sonsöz
Powered by GitBook
On this page

Was this helpful?

Temel C Programlama -41- string.h Başlık Dosyası ile Karakter Dizisi İşlemleri

Daha öncesinde size ctype.h başlık dosyasını anlatmış fakat karakter dizileri için stdio.h, stdlib.h ve string.h başlık dosyalarının da kullanıldığını söylemiştik. Şimdiden belirtelim ki bütün fonksiyonlar için örnek uygulama vermeyeceğim. Sadece önemli gördüklerim hakkında uygulama göstereceğim ve geri kalanı denemek üzere size bırakacağım. Bu kütüphane fonksiyonları dilin teferruatı olduğu için uzun uzadıya anlatmaya gerek yoktur. Çünkü programcılıkta karşınıza belki yüzlerce kütüphane dosyası ve binlerce fonksiyon çıkacaktır. Karşınıza çıkabilecek bütün fonksiyonları anlatan bir eğitim veya öğretecek bir öğretmen bulma imkanınız yoktur. Dilin temelini bir eğitim ile alsanız dahi karşınıza çıkacak kütüphanelerin fonksiyonlarını kullanmayı sürekli öğrenmeniz gerekecektir. Ben de bunu göz önünde bulundurarak dilin temelini uzun uzadıya anlatsam da ayrıntısı olan bu tarz fonksiyonları yorulmamak adına kısa kesiyorum. Bu asla bilgimi sakladığım anlamına gelmesin.

string.h dosyası

Karakter dizisi kütüphanesi (<string.h>) karakter dizileriyle alakalı pek çok kullanışlı fonksiyonu bünyesinde bulundurur. Bunlardan başlıcaları karakter dizisi kopyalama, karakter dizisi birleştirme, karakter dizilerini karşılaştırma gibi fonksiyonlardır. Daha önce söylediğimiz gibi C dilinde karakter dizileri üzerinde operatörler ile işlem yapamadığımız için bu tarz fonksiyonlar vasıtasıyla bu işlemleri yapmaktayız. Şimdi string.h kütüphanesinin fonksiyonlarının ne işe yaradığını baştan sona verelim ve sonrasında örneklere geçelim.

Fonksiyon Adı

İşlev

memcpy

Bir hafıza blokunu kopyalar.

memmove

Bir hafıza blokunu taşır.

strcpy

Bir karakter dizisini kopyalar.

srncpy

Karakter dizisindeki karakterleri kopyalar.

strcat

Karakter dizilerini birleştirir

strncat

Karkater dizisindeki karakterleri birleştirir.

memcmp

İki hafıza blokunu karşılaştırır

strcmp

İki karakter dizisini karşılaştırır.

strcoll

İki karakter dizisini C yerelini kullanarak karşılaştırır. (locale)

strncmp

İki karakter dizisinin karakterlerini karşılaştırır.

strxfrm

C yereli kullanılarak (locale) karakter dizisi dönüştürülür.

memchr

Bir hafıza blokundaki bir karakter tespit edilir.

strchr

Karakter dizisindeki belirtilen karakterin ilk konumu tespit edilir.

strcspn

Karakter dizisinde belli bir karakter aranır ve ilk konumu tespit edilir.

strpbrk

Karakter dizisi içindeki karakterler tespit edilir.

strrchr

Karakter dizisindeki belli bir karakterin en son yer aldığı konum tespit edilir.

strspn

Karakter dizisinde belli bir karakter dizisi aranır ve ilk konumu tespit edilir.

strstr

Karakter dizisi içinde alt karakter dizisi aranır.

strtok

Bir karakter dizisi parçalara bölünür.

memsek

Bir hafıza blokunu doldurur.

strerror

Hata mesajını içeren karakter dizisinin işaretçisi tespit edilir.

strlen

Karakter dizisi uzunluğu tespit edilir

NULL (makro)

BOŞ İŞARETÇİ

size_t (TİP)

sizeof operatörünün döndürdüğü değer tipi

Bir karakter dizisinin uzunluğunu bulma

Elimizde bir karakter dizisi var fakat bunun uzunluğunu bilmiyoruz. Uzunluğu dizinin kaç karakter içerdiği demektir ve bazen bunu öğrenmemiz önemli olabilir. Bunun için bir algoritma kurar ve dizi işaretçisinden (sıfırıncı eleman) itibaren bitirme karakterini (‘\0’) bulana kadar saydırabiliriz. Fakat daha kolayı strlen() fonksiyonunu kullanmaktır. Bu fonksiyon bize dizinin uzunluğunu hemen verecektir.

Fonksiyonu kullanmadan önce hemen fonksiyonun prototipine bakalım. Ne kadar ne işe yaradığını bilsek de ezbere kullanmak doğru olmaz.

size_t strlen ( const char * str );

Görüldüğü gibi strlen fonksiyonu tahmin ettiğimiz gibi bir karakter dizisi değeri alsa da karakter dizisinin boyutunu size_t biçiminde geri döndürmekte. Bu değeri geri dönen değeri (unsigned) çeviricisi ile işaretsiz tamsayıya çevirmemiz gerekir. Ya da %u yerine %zu yazmamız gerekiyor. Bunu dikkate alarak bir program yazalım.

#include <stdio.h>
#include <string.h>

main()
{
	char karakter_dizisi[100] ="";
	puts("Olcmek istediginiz yaziyi yazin:\n");
	scanf("%s", karakter_dizisi);
	printf("Karakter Dizisinin Uzunlugu : %u", 
	(unsigned)strlen(karakter_dizisi));
}

Programı çalıştırdığımızda ekran görüntüsü şu şekilde olacaktır.

Görüldüğü gibi girdiğimiz metnin kaç karakterden oluştuğu burada yazdırılmakta. Yalnız strlen() fonksiyonunun bir eksikliği vardır o da boşluk bıraktığımız metinlerde boşluktan sonrasını okuyamamasıdır. Daha önceden sizeof operatörü ile de dizi boyutunun bulunduğundan bahsetmiştir. strlen burada bitirme karakterini saymadan dizi uzunluğunu bize vermektedir. sizeof ise bitirme karakterini (‘\0’) saymaktadır. Yukarıdaki programı eğer sizeof ile yapmış olsaydık 11 sonucunu elde ederdik.

Karakter dizilerini birleştirme

İki karakter dizisini birleştirmek için “+” işaretini kullanamayacağınızı biliyorsunuz değil mi? Bu bazı dillerde mümkün olsa da (mesela C++) C dilinde operatörleri aşırı yükleme denilen bir kavram yoktur. O yüzden dilin temel ögeleri ile halledilmeyen bütün işleri kısa yoldan fonksiyonlarla halletmemiz lazımdır. Bunun için strcat() fonksiyonunu kullanacağız. Öncelikle fonksiyonun ne olduğunu ve nasıl kullanıldığını öğrenmek için referanstan fonksiyon prototipine bakıyoruz.

char * strcat ( char * destination, const char * source );

Burada görüldüğü gibi bir kaynak bir de hedef olarak iki argüman almakta. strcat bir değer döndürse de bu referansta destination değeri olduğu belirtilmekte. Yani bu fonksiyon sonuc = a + b gibi bir işlem yapmak yerine a+=b gibi bir işlem yapmakta. Yani bizim destination olarak belirttiğimiz eklenecek kısım kalıcı değişikliğe uğramakta. Bunu düşünerek şöyle bir program yazalım.

#include <stdio.h>
#include <string.h>

main()
{
	char s1 [] = "AVR";
	char s2[] = "Mikrodenetleyici";
	printf("Ilk Karakter Dizisi : %s \n", s1);
	printf("Ikinci karakter dizis: %s \n",s2);
	strcat(s1, s2);
	printf("Birlestirilmis: %s",s1);
}

Program çalıştığında ekran görüntüsü şöyle olacaktır.

char *
STRCAT (char *dest, const char *src)
{
  strcpy (dest + strlen (dest), src);
  return dest;
}

Burada strcat fonksiyonu strcpy fonksiyonu kullanılarak oluşturulmuş. Aslında burada iş yapan fonksiyon strcpy fonksiyonuyken bu fonksiyon strcat bloku içerisinde standarda göre uyarlanmıştır. Şimdi ise gerçek bir fonksiyona bakalım.

char *
strcat(char *dest, const char *src)
{
    size_t i,j;
    for (i = 0; dest[i] != '\0'; i++)
        ;
    for (j = 0; src[j] != '\0'; j++)
        dest[i+j] = src[j];
    dest[i+j] = '\0';
    return dest;
}

Burada strcat fonksiyonunun bir döngü vasıtasıyla yapıldığını görmekteyiz. Elbette ki bütün bu kaynak kodlar derleyiciden derleyiciye değişmektedir. GCC derleyicisinde farklı Microsoft’un derleyicisinde farklı olabilir. Önemli nokta hepsinin standarda uymak zorunda olmasıdır. Eğer kendinizi derleyici yazanlardan daha iyi görüyorsanız bu fonksiyonları kullanmak yerine kendiniz de yazabilirsiniz.

String.h dosyasındaki fonksiyonlara ait kullanım, açıklama ve örnek kodları aşağıdaki referans sayfasından bulabilirsiniz.

PreviousTemel C Programlama -40- ctype.h Başlık Dosyası ile Karakter İşlemleriNextTemel C Programlama -42- stdlib.h ve stdio.h Başlık Dosyaları ile Karakter Dizisi İşlemleri

Last updated 5 years ago

Was this helpful?

Peki biz strcat() fonksiyonunu kullanıyoruz ama arka planda neler işliyor diye sorabilirsiniz. Eğer böyle soruyorsanız iyi bir öğrencisiniz demektir! Arduino kitlesinden gördüğüm üzere pek çok Arduino kullanıcısı digitalWrite(), digitalRead() gibi fonksiyonlar ile program yazarken bu fonksiyonların arka planında neler olduğunu bir kere bile merak edip öğrenmek istememiştir. Merak edip işin derinini öğrenenler ise başarıya ulaşmıştır. Diğerleri ise yerinde saymaya devam etmektedir. O yüzden işin derinini merak edip öğrenmek isteyen hiçbir zaman zarar etmez. Bu soruya cevap vermek istersek strcat fonksiyonu bizim kullandığımız derleyicilerde kaynak kod olarak yer almamaktadır. Kendisi standart kütüphane içerisinde olduğundan derlenmiş halde gelir ve linker (bağlayıcı) vasıtasıyla bizim yazdığımız koda bağlanır. Böylelikle en performanslı şekilde kullanılmış olur. Fakat biz istersek internette çeşitli C derleyicilerinin kaynak kodlarını bulabiliriz. Her derleyicide bu fonksiyon birebir aynı değildir. Hatta yazıldığı sisteme göre bu kütüphane fonksiyonları değişiklik göstermektedir. Örneğin avr-gcc (AVR için C derleyicisi) derleyicisinde printf fonksiyonunu kullanmayı isteyeceğinizi hiç düşünmüyorum. Çünkü AVR mikrodenetleyicilerde çıktı alabileceğiniz bir ekran yoktur. Benim bulduğum strcat için kaynak kodları şöyledir.

Kaynak :

Kaynak:

https://code.woboq.org/userspace/glibc/string/strcat.c.html
https://en.wikibooks.org/wiki/C_Programming/string.h/strcat
http://www.cplusplus.com/reference/cstring/
🙂