BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C Programlama > C örnek kodlar > c_ornek00014

C örnek kodlar

Bir karakter dizisi içindeki karakter dizilerini değiştirme

Program, bg_replace_substr() fonksiyonunun str parametresine geçirilen karakter dizisi içinde yer alan ve find parametresi ile gösterilen karakter dizisini/dizilerini replace parametresi ile gösterilen karakter dizisi ile değiştirir.

Replace parametresindeki karakter dizisi find parametresindeki karakter dizisinden uzun olduğu zaman, karakter dizisinde meydana gelecek boyut artışı fonksiyon içinde realloc() fonksiyonu ile yeniden bellek tahsisi yapılarak dengelenmektedir.


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

char *bg_replace_substr(const char *str, const char *find, const char *replace);

int main(void)
{
    char *pdizi = malloc(100);
    char *rdizi;

    strcpy(pdizi, "Bilgisayarda program geliştirme ve program örnekleri");
    printf("%s\n", pdizi);

    rdizi= bg_replace_substr(pdizi, "program", "yazılım");

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

    free(pdizi);
    free(rdizi);

    return 0;
}

char *bg_replace_substr(const char *str, const char *find, const char *replace)
{
  unsigned find_len, replace_len;
  char *newstr;
  unsigned int newstr_size;      // Yeni oluşturulan karakter dizisinin boyutu
  unsigned int newstr_act = 0;   // Yeni oluşturulan karakter dizisinin aktif konumu
  char *pfind;                   // Değiştirilecek olan karakter dizisinin adresi

  find_len = strlen(find);       // Değiştirilecek olan karakter dizisinin boyutu

  // Ana karakter dizisi veya değiştirilecek karakter dizisi boş ise
  if (!strlen(str) || !find_len) return NULL;

  replace_len = strlen(replace);
  newstr_size = strlen(str) + 1;
  newstr = malloc(newstr_size);

  while ((pfind = strstr(str, find))) {
     // Bulunan karakter dizisine kadar olan karakterleri newstr belleğine kopyalama
     memcpy(newstr + newstr_act, str, pfind - str);
     // Bulunan karakter dizisinin başlangıç adresinin
     // orjinal str işaretçisi ile olan farkını newstr_act değerine ekleme
     newstr_act += pfind - str;
     // Orjinal karakter dizisi adresini, bulunan karakter dizisinin adresinden
     // find uzunluğu kadar ileri alma
     str = pfind + find_len;
     // Yeni oluşturulan karakter dizisine eklenecek veya çıkarılacak olan karakter
     // sayısına göre newstr_size boyutunu hesaplama
     newstr_size = newstr_size - find_len + replace_len;
     // Yeni oluşturulan karakter dizisinin bellek ayırma işlemini yenileme
     newstr = realloc(newstr, newstr_size);
     // replace karakter dizisini newstr dizisine ekleme
     memcpy(newstr + newstr_act, replace, replace_len);
     // newstr_act değerini replace uzunluğu kadar artırma
     newstr_act += replace_len;
  }

  // Kalan değerleri newstr belleğine kopyalama
  memcpy(newstr + newstr_act, str, strlen(str));
  newstr_act += strlen(str);
  *(newstr+newstr_act) = '\0';

  return newstr;
}

Yukarıdaki örnekte, program aşağıdaki satırları ekrana yazar:

Bilgisayarda program geliştirme ve program örnekleri
Bilgisayarda yazılım geliştirme ve yazılım örnekleri