[Çözüldü] C strrchr Fonksiyonu Çalışma Mantığı

Başlatan blacksnow, 24 Şubat 2015 - 09:12:11

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

blacksnow

Merhaba, strrchr fonksiyonunda istediğim satırdan tarama yapmak istiyorum. Aşağıda (s+3) yani b harfinden başlayıp sola tarama yapması gerekiyor.Çıktının 3.satırda olması gerekli.Fakat 7.satırda yazıyor.Yani benim istediğim satırdan değilde en sağdan taramaya başlıyor.

strchr fonksiyonunda böyle bir sorunla karşılaşmadım.İstediğim satırdan sağa doğru tarama yapabiliyordum. Ben mi bir hata yapıyorum yoksa strrchr fonksiyonu strchr-den farklı mı tanımlanmış?Cevaplarınız için şimdiden teşekkürler.

char s[] = "arabalar";
char *p;

p = strrchr((s+3),'a');
printf("%d.satırda\\n",(int)(p-s+1));

Reverser

#include <stdio.h>

int main() {
  char *s;
  char buf [] = "This is a testing";

  s = strrchr (buf, 't');

  if (s != NULL)
    printf ("found a 't' at %s\n", s);

  return 0;
}


çıktı

found a 't' at ting

gerekli açıklamalar yapılmış [1] [2]

[1] http://www.tutorialspoint.com/ansi_c/c_strrchr.htm
[2] http://www.tutorialspoint.com/c_standard_library/c_function_strrchr.htm

XFCE ROCKS !
Powered by Thunar & XFWM4



blacksnow

Yani strrchr sadece son satırdan taramaya başlıyor.Ben hangi index-i yazarsam yazayım farketmiyor.

Çünkü strchr fonksiyonu ile bu dediği yapabiliyorum.İstersem (s+3) den sağ tarafa tarayabiliyorum.Sorumun cevabını tam alamadım.Teşekkürler.

blacksnow

@Reverser bir cevap yazabilirseniz sevinirim.Sorum çok açık strrchr fonksiyonu ile istediğim index'ten arama yapabiliyor muyum?Çünkü strchr ile yapabiliyorum.Verdiğiniz eklerde sorumun cevabı yok.Varsada anlayamadım.Umarım ufak bir cevap yazabilirsiniz.Şimdiden teşekkürler.

Reverser

Alıntı yapılan: blacksnow - 25 Şubat 2015 - 15:34:49
@Reverser bir cevap yazabilirseniz sevinirim.Sorum çok açık strrchr fonksiyonu ile istediğim index'ten arama yapabiliyor muyum?Çünkü strchr ile yapabiliyorum.Verdiğiniz eklerde sorumun cevabı yok.Varsada anlayamadım.Umarım ufak bir cevap yazabilirsiniz.Şimdiden teşekkürler.

Hocam şöyle, strchr(); fonksiyonu bahsi geçen string'i kelimenin baş kısmında bulur. strrchr(); fonksiyonu ise, bahsi geçen karakteri ya da string'i kelimenin sonunda (string en son nerede kullanıldı ise orada) bulur.

Örnekler
1-) strrchr kullanımı


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

main()
{
char bellek[] = "arabalar";
char *ptr;

    ptr=strrchr(bellek, 'a');

if (ptr == NULL) {

printf("a karakteri bulunamadi.\n");
}
else {
printf("a karakteri %d. karakterde bulundu.\n", ptr - bellek+1);
}
return 0;
}


çıktı

a karakteri 7. karakterde bulundu.

2-)strchr kullanımı


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

main()
{
char bellek[] = "arabalar";
char *ptr;

    ptr=strchr(bellek, 'a');

if (ptr == NULL) {

printf("a karakteri bulunamadi.\n");
}
else {
printf("a karakteri %d. karakterde bulundu.\n", ptr - bellek+1);
}
return 0;
}


çıktı

a karakteri 1. karakterde bulundu.





XFCE ROCKS !
Powered by Thunar & XFWM4



blacksnow

Hocam bunları zaten biliyorum.Benim sorduğum daha farklı birşeydi.Yine de teşekkür ederim.

Reverser

ilk yazdığınız mesaj için yazdım indexleme yapılabilir mi bilmiyorum.

XFCE ROCKS !
Powered by Thunar & XFWM4



7hr33l3t73r

Ben biraz inceleyebildim.
Izlenimlerimi fikir vermesi acisindan paylasiyorum.


char s[] = "arabalar";
char *p;

p = strrchr(s, 'a');
printf("%d.satırda\n",p-s+1);

cikti

7.satırda

Arabalar kelimesinde a harfinin fazla olmasi nedeniyle bende arabalar kelimesini hosgeldin kelimesi ile degistirmeye karar verdim oncelik olarak.

char s[] = "hosgeldin";
char *p;

p = strrchr(s, 's');
printf("%d.satırda\n",p-s+1);

cikti

3.satirda

dogru sonuc almaya basladik :)
Simdi arabalar kelimesinde calismaya geldi :)

char s[] = "arabalar";
char *p, *t;

t = strchr(s, 'a');//soldan saga
p = strrchr(s, 'a');//sagdan sola (gece gece karistirmadik umarim :)

printf("%d.satırda   \n",t-s);
printf("%d.satırda   \n",p-s);
printf("%d.satırda   \n",p-s-4);

cikti

0.satırda   
6.satırda   
3.satırda

a harfleri satirli bicakli kavgaya geldikleri icin sorun oluyordu bende printf komutunda  karar verdim. :)
Insallah yanlis anlayip, daha da kafa karisikligina yok acmamisimdir.
Gec saat olunca benim kafa gidip gelmeye basladi. he yoruldu tabi:)
ben bir yatirayim onu sabah tekrar bakarim konuya :)
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

blacksnow

Hocam bu konu çok uzadı.Herkes fonksiyonların nasıl çalıştığını açıklamaya çalışıyor.Bunun için de çok teşekkür ederim.Ama ben sadece indexleme yaparak istediğim satırdan arama yapabilir miyim diye sormuştum.strchr ile yapabildim.strrchr ile yapamadım.Konunun en başında da bunu yazmaya çalışmıştım zaten.

En baştaki örnekte (s+3) 3. indexten başlayıp sola arama yapmak istemişim.Yani o da b karakteri oluyor.Burada (s+2) döndürmesini umuyordum fakat öyle olmadı.En sağdan tarama yapıp (s+6) döndürdü.Eğer strchr ile yaparsam b nin hemen sağındaki indexi döndürdü yani en baştan bakmadı.

Aslında beklediğim cevap şu strrchr ile istediğin indexten arama yapabilirsin yada yapamazsın.

Amenofis

Konuyu baştan sona tekrar okuman lazım çünkü bu fonksiyonların çalışma mantığını anlayamamışsın. Ayrıca stringler konusunda da eksikliğinin olduğu belli. Bir de "satır" diyerek kafa karışıklığına yol açıyorsun, karakter demen lazım satır değil.

Sola doğru arama diye bişey olmaz çünkü sol diye biryer yok. s+3 dediğin zaman bir adres vermiş oluyorsun ki bu adres stringin "en başı" oluyor ve buradan başlayıp null karakteri görene kadar devam ediyor. Fonksiyonun s+3 ten öncesi hakkında hiçbir malumatı olamaz, sürekli ileri doğru işler. strchr o adresten itibaren bulduğu ilk karakteri, strrchr ise son karakteri (null'a en yakın olan) verir.

Üzerine basa basa tekrar edeyim. const char *s = "Arabalar"; stringinde

s -> "Arabalar", uzunluk = 8
s+2 -> "abalar", uz = 6
s+7 -> "r", uz = 1

s+3 dediğinde strchr "balar" stringindeki ilk a'yı yani 2. karakteri verir. strrchr ise sondaki a'yı yani 4. karakteri (adresini) verir. Gördüğün gibi istediğin karakterden başlatma imkanın her zaman var. Sanırım sorduğun soru bu idi.

blacksnow

#10
Anladığım kadarıyla strrchr fonksiyonun null değerini görene kadar arama yapmasına imkan yok bu yüzden hangi karakterden başlatırsam başlatayım null değerine en yakın olan geri dönüyor.

En sonda istediğim karakterden başlatabileceğimi söylemişsiniz.Ama bu strrchr de pek de * bir şey değiştirmiyor gibi.

"balar","lar","ar" hangisini ele alırsam alayım null'a en yakını seçeceği için bir şey farketmiyor.Yani bu fonksiyon ile null değerine en yakın ikinci 'a' karakterini buldurmam mümkün değil.

Bu sefer anladım.Eğer yazdıklarımda yanlış bir yer varsa düzeltiniz.Teşekkürler herkese.

Amenofis

Evet strrchr de bişey farketmez. Yapmak istediğin şeyi söyleseydin daha iyi yardımcı olurduk.