2016-04-09 21 views
0

Aşağıdaki kod, iki dizede ortak karakteri bulur ve varsa ortak dizeye bir işaretçi döndürür. Strpbrk işlevini yerleşik işlevler veya aboneler kullanmadan taklit etmeye çalışıyorum.Dizede genel karakterleri arama ve işaretçiyi ortak karaktere döndürme (strpbrk kullanmadan)

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



char *find_char(char const *source, char const *chars){ 

    char* str1; 
    char* str2; 

    if (source == NULL || chars == NULL) 
     return NULL; 

    else { 

     for(*str1=&source != '\0'; ++str1;){ 
      for(*str2=&chars != '\0'; ++str2;){ 

       if (*str1 == *str2) 

        return str1; 

       else return NULL;} 

    } 

} 
} 

char* main(){ 
    char const *source = "ab"; 
    char const *chars = "bc"; 
    find_char(source, chars); 
} 

Ama Koşu aşağıdaki hatayı

alıyorum "/home/ubuntu/workspace/hello-c-world.c"
bash: satır 12: 29.755 Segmentasyon hatası "$ file.o"
Süreç koduyla çıkıldı $ args: 139

Ben C'de bir acemi ve işaretçileri işlemek için öğrenme, bana yanlış yapıyorum bildirin ve ben nasıl güçlendirebileceğinizi lütfen benim C programlama becerileri, şu anda çoğunlukla Kenneth Reek kitabını "C İşaretçiler"

Teşekkür

+0

Sana kaçak işaretçi sorunlarını açıklayabilir char * –

cevap

0

Çeşitli ìf mantık ve kaçak işaretçi sorunlar kullanıyorum. Aşağıdaki Sabit kod:

char *find_char(char const *source, char const *chars){ 

    char* str1; 
    char* str2; 

    if (source != NULL && chars != NULL) { 
     for(str1=source; *str1; str1++){ 
      for(str2=chars; *str2; str2++){ 
       if (*str1 == *str2) return str1; 
      } 
     } 
    } 
    return NULL; 
} 

char* main(){ 
    char const *source = "ab"; 
    char const *chars = "bc"; 
    char *x; 
    x = find_char(source, chars); 
    if (x != NULL) printf("%c", *x); 
} 
+0

bir const char * atamak olamaz? veya işaretçi yönlendirmeyi nereden alabileceğimi öner. Teşekkürler –

+0

@SundasWaheed Asıl sorun 'for' ifadeleridir. Döngü amaçlanan şekilde sonlandırılmayacaktır çünkü '* str2 = & chars! = '\ 0';' '' '' '' '' '' '' '' 'str2' = ('' adres '' 2 '' adresindeki bellek konumu '')' 've 'karakterleri ile 'chars'), ancak buna ek olarak, bu atama asla 0'a dönmeyecektir (çünkü & chars sıfır olmayan bir adres olduğundan) ve döngü sonsuza kadar devam edecektir (bir segmentasyon hatasına yol açar). Gerçekte yapmanız gereken, cevabımdaki kodda yaptığım gibi 'str2' işaretçisini 'chars' adresiyle başlatmaktır. Aynı str1 ile diğer 'for' için de geçerlidir. – Guido

+0

@SundasWaheed str2' ve '* str2',' chars' ve '& chars' arasındaki ve kodun ne anlama geldiği arasındaki farkla ilgili. Adres veya bu adrese işaret eden hafıza içeriği. – Guido