Strstr Fonksiyonu Yardım

Arkadaşlar merhaba. strstr ile aynı işleve sahip bir fonksiyon yazmam gerekiyordu aşağıdaki fonksiyonu yazdım. Ama visual studio “İşlenmemiş özel durum oluştu: okuma erişimi ihlali.” şeklinde hata veriyor. Fonksiyonun hangi kısmını hatalı yazmışım yardımcı olur musunuz?

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

char* my_strstr(char* str1, char* str2){
int uzunluk=0;
int i;
int x=1; //k, hem str1/i hem str2'yi sonraki harfe geçirmek için ortak değişken.
char* p;
for(i=0;i<str2[i]!='\n';i++) uzunluk++; // strlen fonksiyonu kullanmadan str2'nin uzunluğunu buldum. 
              
              
    for(i=0; str1[i]!='\n'; i++){
             if(str2[i] == str1[0]){ //Aranacak kelimenin ilk harfi uyuşursa aşağıdaki döngüye girecek.
                  p = &str1[i];
             
            while(str2[x]!='\n' && str2[x]==str1[x+i])   x++;
            // uyuşan kelime sayısı uzunluğa eşit olduğu anda döngü bitecek.
            if (x == uzunluk)
                  return  p;
            
                      }
              }
return NULL;
}
int main(){
	

char a[] = "Bilgisayarlar";
  char b[] = "lar";

printf("%s",my_strstr(a,b));


}

Bu newline'a tekabül ediyor, size null terminator lazım.

1 Beğeni

Çok doğru.Fark edince nasıl böyle yazmışım diye şaşırdım, dalgınlığıma gelmiş olsa gerek teşekkür ederim.

@Then_Shiffman Şu anda kod çalışıyor ama yanlış çalışıyor. Fonksiyon "lar"ın başladığı noktanın adres değerini döndermesi gerekirken NULL dönderiyor.

a.c: In function ‘my_strstr’:
a.c:9:18: warning: comparison of constant ‘10’ with boolean expression is always true [-Wbool-compare]
    9 | for(i=0;i<str2[i]!='\n';i++) uzunluk++; // strlen fonksiyonu kullanmadan str2'nin uzunluğunu buldum.
      |                  ^~
a.c:9:10: warning: suggest parentheses around comparison in operand of ‘!=’ [-Wparentheses]
    9 | for(i=0;i<str2[i]!='\n';i++) uzunluk++; // strlen fonksiyonu kullanmadan str2'nin uzunluğunu buldum.
      |         ~^~~~~~~~

Dolayısıyla str2'nin (muhtemel) substring olması gerekiyor, değil mi?

Burada bir terslik var gibi o zaman.

Elinize bir kağıt kalem alarak yazdığınız programı satır satır işlerseniz, ne olup bittiği üzerinde daha çok kontrolünüz olur diye düşünüyorum.

Evet, 1 ile 2’yi degistirince oluyor. (Yukaridaki warning’leri de hallettikten sonra.)

Buradaki akil karisikliginin sebebi de kotu isimlendirme. str1/str2 yerine samanlik/igne, i yerine de samanlik_indisi kullanilsaydi, igne[samanlik_indisi] kodunun yanlis oldugu goze batardi.

x de sonraki_kontrol_edilecek_igne_indisi olsa gerek. Oyle olsaydi sifirlanmadigi goze batardi.

@Then_Shiffman @aib Emeğinize sağlık şu anda sıkıntısız çalışıyor kod.

Kodun son kısmında ufak bi hata vardı. Eğer str2’nin uzunluğu 1 karakter ise döngüye girmediği için NULL döndürüyordu. Bu hatayı düzelttim. Bİ şekilde ihtiyaç duyacak olan olursa aşağıya bırakıyorum, iyi forumlar.

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

char* my_strstr(char* str1, char* str2){
int uzunluk=0;
int i;
int x=1; //x, hem str1/i hem str2'yi sonraki harfe geçirmek için ortak değişken.
char* p;
for(i=0;i<str2[i]!='\0';i++) uzunluk++; // strlen fonksiyonu kullanmadan str2'nin uzunluğunu buldum. 
              
              
    for(i=0; str1[i]!='\0'; i++){
              if(str1[i] == str2[0]){ //Aranacak kelimenin ilk harfi uyuşursa aşağıdaki döngüye girecek.
                  p =&str1[i];
                  
             
              while(str2[x]!='\n' && str2[x]==str1[x+i]){
			     x++;
              // uyuşan kelime sayısı uzunluğa eşit olduğu anda döngü bitecek.
              if (x == uzunluk)
                  return  p;
            
                     }
	if(uzunluk == 1) return p; //Aranan kelime tek karakter ise yukarıdaki While döngüsüne girmeyeceği için bu satırı ekledim.
					  }
              }

return NULL;
}


int main(){
	

char a[] = "Bilgisayarlar";
  char b[] = "ilgi";

printf("%s",my_strstr(a,b));


}

Bahsettigim sikintilarin hepsi cozulmemis, kod hala yanlis calisiyor malesef.

Bu arada acilen bir formatlama tool’u bulmak da gerekiyor.

formatlama toolu derken neyi kast ettiniz acaba?