2016-04-10 2 views
1

Girilen adın listedeki isimlerle uyuşmadığı durumlarda "Dog found found" yazıyorsa bir kod yazıyorum. Değilse, listeyi yazdırır.Döngüsüm birden çok kez yazdırıyor. Bir kez yazdırmak için nasıl alabilirim?

Sorunum, yalnızca bir kez değil, "Dog found found" ı birden çok kez yazdırıyor.

Kodu: Arama tamamlanana kadar

void search (struct dog *list) 
{ 
    char name[NAME_LEN+1]; 

    struct dog *p; 

    printf("Enter dog’s name: \n"); 
    scanf("%s", name); 

    name[0] = toupper(name[0]); 
    for(p = list; p != NULL; p = p->next) 
    { 
     if(strcmp(name, p->dog_name) != 0) 
     { 
     printf("Dog not found."); 
     } 
     else 
     { 
      printf("\n"); 
      printf("%d \t",p->number); 
      printf("%s \t",p->dog_name); 
      printf("%s \t",p->breed); 
      printf("%s \t",p->owner_last_name); 
     } 
    } 
} 
+0

Sorunuzla alakasız, ancak 'scarf' ifadeniz, kullanıcı adı NAME_LEN karakterinden daha uzun bir ad girdiğinde arabellek taşmasına tabidir. –

cevap

5

Sen bulunamadı mesajı yazdırmak olmamalıdır.

Aşağıdaki örnek listede yalnızca bir köpeğin eşleşeceğini varsayar. Böylece, eğer varsa, en kısa sürede döngü sonlandırılır. Birden fazla eşleşme mümkün ise hemen break yazmayın, bunun yerine found bayrağını ayarlayın ve aramaya devam edin. Ekstra bir not olarak

for(p = list; p != NULL; p = p->next) 
{ 
    if(strcmp(name, p->dog_name) == 0) 
     printf("\n"); 
     printf("%d \t",p->number); 
     printf("%s \t",p->dog_name); 
     printf("%s \t",p->breed); 
     printf("%s \t",p->owner_last_name); 
     break; 
    } 
} 

if (p == NULL) { 
    printf("Dog not found."); 
} 

, name[0] = toupper(name[0]); gerçekten girişi normalleştirmek için doğru bir yol değildir. Örneğin, kullanıcı adın ortasında beklenmedik bir büyük harf girerse, aramanız başarısız olur. Bunun yerine, tüm dizge üst/küçük harflerini yapmalı veya büyük/küçük harfe duyarlı olmayan bir karşılaştırma kullanmalıdır (örn. POSIX sistemlerinde strcasecmp).

+0

Bulunan bir bayrağı nasıl eklerim? Kodumu değiştirdim ve işe yaradı, tek şey listeyi yazdırdıktan sonra "Köpek bulunamadı" göstermesi. –

+0

Lütfen güncellenmiş kodunuzun neye benzediğini tam olarak gösterin. – kaylum