2011-10-30 26 views
5

अगर मैं "परीक्षण" इनपुट करता हूं तो कोड का यह विशेष टुकड़ा स्ट्रस्ट्र() पर झूठा क्यों लौटाता है?स्ट्रस्ट्र काम नहीं कर रहा

char input[100]; 

int main() 
{ 
    fgets(input, 100, stdin); 
    printf("%s", input); 

    if(strstr("test message", input)) 
    { 
     printf("strstr true"); 

    } 


} 

मैंने सोचा कि स्ट्रेट ने दूसरे परम के उदाहरणों के लिए पहला पैरा खोजा है? यह तब काम करता है जब मैं कुछ पाठ के साथ इनपुट को प्रतिस्थापित करता हूं या इसे सीधे कुछ सौंपता हूं, लेकिन ऐसा लगता है कि यह fgets के साथ काम नहीं करता है।

+0

समस्या से निपटने के लिए, http://stackoverflow.com/questions/2693776/removing-trailing-newline-character-from-fgets-input –

उत्तर

10

ऐसा इसलिए है क्योंकि fgets न्यूलाइन चरित्र को संग्रहीत करता है ताकि जब स्ट्रस्ट तुलना करता है तो यह विफल हो जाता है।

आदमी पृष्ठ से:

fgets() में से की ओर इशारा किया बफर में धारा और उन्हें स्टोर से सबसे एक आकार वर्णों से कम में पढ़ता है। पढ़ना एक ईओएफ या एक नई लाइन के बाद बंद हो जाता है। यदि कोई नई लाइन पढ़ी जाती है, तो यह को बफर में संग्रहीत किया जाता है। एक '\ 0' बफर में अंतिम वर्ण के बाद संग्रहीत किया जाता है।

+0

संभवतः निकालें और आपको +1 प्राप्त करें :) – FailedDev

+0

@sashang वह दस्तावेज़ भाग अभी भी भ्रमित है। यह ईओएफ या न्यूलाइन कहता है। जो यह है? मैं एक ट्यूटोरियल के माध्यम से जा रहा था और यह मुझे असफल रहा था। एक अंतिम '\ 0' के साथ अंतिम वर्ण को प्रतिस्थापित करने से चाल चल गई लेकिन ट्यूटोरियल ने ऐसा लगता है कि' fgets' स्वचालित रूप से '\ 0' डालता है जब वास्तव में यह \ n' रखता है। इस 'स्ट्रस्ट्र' की वजह से काम नहीं कर रहा था। लेकिन फिर किताब ने क्यों कहा कि यह काम करेगा? – Andy

+0

@ एंडी: 'ईओएफ या न्यूलाइन' या तो ईओएफ या न्यूलाइन या दोनों का मतलब है। 'या' यहां तार्किक बूलियन का अर्थ है या नहीं 'या' जिसका उपयोग बोलचाल अंग्रेजी में किया जाता है। इसलिए उनमें से दोनों एक वैध जवाब है। – sashang

6

fgets के बाद input[strlen(input) - 1] = '\0'; जोड़ें। fgets न्यूलाइन चार ('\n') में पढ़ता है। "test message" में '\n' कोई input इसमें कभी भी शामिल नहीं होगा।

आप वास्तव में अगर न्यू लाइन fgets बुला जानना चाहते हैं कि पूरी लाइन वास्तव में यह में फिट करने में सक्षम था के बाद बफर के अंत में है देखने के लिए जाँच करनी चाहिए, और यह भी स्पष्ट रूप से इसे हटाने के लिए।

+0

क्या मुझे लगता है कि जब 'fgets' पढ़ता है, कहता है, "हैलो", यह वास्तव में' हैलो \ n \ 0 "' या '" हैलो \ n "' पढ़ता है। – Andy

+0

यह '" हैलो \ n "' पढ़ता है और फिर स्ट्रिंग को '' \ 0'' से समाप्त करता है। लेकिन यह केवल तभी होता है जब एक न्यूलाइन चरित्र पढ़ा जाए। – AusCBloke

+0

मुझे प्रश्न दोबारा दोहराएं। कुल परिणाम 'fget' का क्या होना चाहिए? मैं पूछता हूं क्योंकि 'स्ट्रस्ट्र' काम नहीं कर रहा है। जब मैं 'चर [strlen (चर) -1] = '\ 0'' करता हूं, यह काम करता है। जब 'strlen' लंबाई के लिए स्ट्रिंग को पार करता है, तो क्या यह समाप्ति शून्य मान को छोड़ देता है? तो '" हैलो \ n \ 0 "', क्या यह 6 है क्योंकि इसमें नई लाइन शामिल है? और यदि ऐसा है, तो परिणाम '' हैलो \ 0 \ 0 '' होगा यदि मैं अपनी समस्या का समाधान कैसे करूं जो थोड़ा अपमानजनक है। रास्ते में आपके समय के लिए धन्यवाद। – Andy

संबंधित मुद्दे