पहली प्रविष्टि के बाद चरित्र गलत क्यों है?

मैंने stdin से अक्षर इनपुट गिनने के लिए सी में एक प्रोग्राम लिखा है। मैं एक से अधिक प्रविष्टियों की अनुमति देने के लिए एक लूप का उपयोग करना चाहता था। (नोट: मैं प्रोग्रामिंग के लिए नया हूँ।)

main()
{
    long nc;
    int c;
    int kc=1;
    for (kc=1;kc<=5;kc=kc+1)
    {
        nc=0;
        c= getchar();
        while(c != '0')
        {

        ++nc;
        c=getchar();
        }

        printf("%1d\n",nc);

    }
    return 0;
}

तो मूल रूप से जैसा कि आप अनुमान लगाएंगे, लूप 5 प्रविष्टियों को स्वीकार करता है।

समस्या: जब मैं Sky0 दर्ज करता हूं तो पहला परिणाम ठीक है, 3. लेकिन तब से, एक को गिनती में जोड़ा जाता है। <�कोड> 5 , sit0 की गणना में dame0 परिणामों की गणना में dame0 परिणाम दर्ज हो रहा है।

विभिन्न चरणों में प्रिंस का उपयोग करके समस्या को डीबग करने का प्रयास करते समय, मुझे एहसास हुआ कि पहले परिणाम के बाद कोड इनपुट का अंत पाता है, 0 , लेकिन लूप को हर जगह के लिए प्रवेश करता है और अगली प्रविष्टि के साथ प्रतीक्षा करता है एनसी 1 के रूप में। इससे संबंधित आउटपुट में त्रुटि होती है।

कृपया बताएं कि मैं कहां गलत हो रहा हूं? और 0 को समझने के बाद भी यह लूप में प्रवेश क्यों कर रहा है?

आपकी मदद और समय की बहुत सराहना करें :)

0
जोड़ा संपादित
विचारों: 1
एचएमजेडी: धन्यवाद आदमी! ... हाँ मैंने इसे सही किया, शून्य के साथ एक गैर पेशेवर तरीका टर्मिनैटिन नया था ... आभा समय की सराहना करें :)
जोड़ा लेखक Aki, स्रोत
प्रसाद जी: यह स्पष्ट साथी नहीं है ...
जोड़ा लेखक Aki, स्रोत
सेकी: उम्मीद है कि प्रसाद जी के लिए था :)
जोड़ा लेखक Aki, स्रोत
nc 0 के लिए लूप के प्रत्येक पुनरावृत्ति पर सेट हो जाता है। जबकि लूप समाप्त हो जाएगा जब वर्ण शाब्दिक '0' पाया जाता है। मैं जांचता हूं कि @aix ने क्या कहा और यह सही है, मैंने जो किया उसके लिए ideone.com/gw1ON देखें। यह आने वाले इनपुट के हिस्से का निर्माण करने वाले न्यूलाइन चरित्र को दिखाता है।
जोड़ा लेखक hmjd, स्रोत
क्या यह संभव है c == '0'? जब सी == '0' तब लूप समाप्त हो जाएगा। मुझे हर बार सी = -1 मिल गया है।
जोड़ा लेखक Prasad G, स्रोत
क्या आप झगड़ा बोल रहे हैं? कृपया अपने प्रश्न लिखते समय और कोड को इंडेंट करते समय कुछ प्रयास करें। अन्य लोग इसे पढ़ने के लिए समय बर्बाद नहीं करेंगे।
जोड़ा लेखक Seki, स्रोत

1 उत्तर

समस्या यह है कि जब आप एंटर दबाते हैं, तो वह एक वर्ण भी बन जाता है (मान 0x1a), और यह getchar कॉल लूप के बाहर कॉल द्वारा वापस किया जाता है।

आप कुछ ऐसा कर सकते हैं:

while (getchar() != '\n') nc++;

इस तरह आपको स्ट्रिंग के अंत को चिह्नित करने के लिए 0 का उपयोग करने की भी आवश्यकता नहीं है।

0
जोड़ा
हाँ मैंने इसे दोस्त बनाया:) ... thnks :)
जोड़ा लेखक Aki, स्रोत
ओह ... नया यहाँ:) ... करेंगे ...
जोड़ा लेखक Aki, स्रोत