2013-06-03 5 views
6

मैं ऐसे प्रोग्राम को लिखने की कोशिश कर रहा हूं जो एक स्ट्रिंग की तुलना करता है जो उपयोगकर्ता तारों की सरणी के साथ प्रवेश करता है।स्ट्रस्ट्र() फ़ंक्शन

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

char animals[][20] = { 
    "dogs are cool", 
    "frogs are freaky", 
    "monkeys are crazy" 
}; 

int main() { 
    char input[10]; 

    puts("Enter animal name: "); 
    fgets(input, sizeof(input), stdin); 

    int i; 
    for(i = 0; i < 3; i++) { 
     if(strstr(animals[i], input)) 
      printf("%s", animals[i]); 
    } 
    return 0; 
} 

जब मैं मेंढ़क दर्ज करते हैं, उदाहरण के लिए यह संदेश "मेंढ़क फ्रीकी रहे हैं" मुद्रित करना चाहिए, लेकिन यह कुछ भी नहीं बाहर प्रिंट करता है।

इसलिए मैंने प्रत्येक बार स्ट्रस्ट्र() फ़ंक्शन के मान को मुद्रित करने के लिए एक पंक्ति लिखने की कोशिश की और वे सभी 0 लौटे, जिसका अर्थ है कि सभी तुलना विफल रही। मुझे समझ में नहीं आता, क्यों कोई मेरी मदद कर सकता है?

उत्तर

7

ऐसा इसलिए है क्योंकि आपकी स्ट्रिंग में न्यूलाइन वर्ण शामिल है।

fgets documentation से:

एक नई पंक्ति चरित्र fgets पढ़ने को रोकने के लिए बनाता है, लेकिन यह समारोह द्वारा मान्य वर्ण माना जाता है और स्ट्रिंग str में कॉपी किया में शामिल है।

यह समस्या (demo) ठीक करना चाहिए:

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

char animals[][20] = { 
"dogs are cool", 
"frogs are freaky", 
"monkeys are crazy" 
}; 

int main() { 
    char input[10]; 

    printf("Enter animal name: "); 
    scanf("%9s", input); 

    int i; 
    for(i = 0; i < 3; i++) { 
     if(strstr(animals[i], input)) 
      printf("%s", animals[i]); 
    } 
    return 0; 
} 
5

fgets में बफर में इनपुट न्यूलाइन वर्ण शामिल है। आपके तारों में उनमें कोई नई लाइन नहीं है, इसलिए वे कभी मेल नहीं खाएंगे।

5

सबसे अधिक संभावना है, fgets() में उपयोगकर्ता द्वारा दर्ज किए जाने वाले नए अक्षरों को शामिल किया गया है। इसे हटाएं:

char *p = strchr(input, '\n'); 
if (p) 
    *p = 0; 
+0

'* पी = 0;' == '* पी = '\ 0'' ?? –

+2

@ एमएफ_ हाँ [15 वर्ण] –