2017-03-26 28 views
5

को छोड़ दिया जाता है नीचे दिए गए कोड में पाश में, scanf("%[^\n]s",array) काम नहीं कर रहा। यह इनपुट की प्रतीक्षा नहीं करता है और छोड़ दिया जाता है। लेकिन % से पहले एक स्थान समस्या को हल करता है। क्यूं कर?% [^ N] scanf में निवेश के लिए इंतजार नहीं करता है और

यहाँ गलत कार्यक्रम है:

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

int main()  
{  
    int t; 
    scanf("%d",&t); 
    while(t--){ 
     char arr[199]; 
     scanf("%[^\n]s",arr); 
     printf("%s",arr); 
    } 
    return 0; 
} 

यहाँ सही कोड है:

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

int main() 
{  
    int t; 
    scanf("%d",&t); 
    while(t--){ 
     char arr[199]; 
     scanf(" %[^\n]s",arr); 
     printf("%s",arr); 
    } 
    return 0; 
} 

यह अपेक्षा के अनुरूप काम करने के लिए % से पहले एक स्थान की आवश्यकता क्यों है?

+0

ऐसा इसलिए है क्योंकि आपके पास एक नई लाइन है जिसे छोड़ने की आवश्यकता है। पहला स्कैनफ सिर्फ संख्या को पढ़ता है और आपके पास अभी भी इनपुट में नई लाइन शेष है। और लूप में आपके स्कैनफ़ेस बचे हुए न्यूलाइन को अवशोषित करने के लिए स्थान के बिना नई लाइन में नहीं पढ़े जाएंगे। वास्तव में आप लूप में केवल scanf ("% s", arr) का उपयोग कर सकते हैं। – Shiping

+0

आप इसे जांचना चाहेंगे: https://stackoverflow.com/questions/45038176/not-able-to-input-a-string-with-spaces-in-a-loop-in-c/45038767?noredirect= 1 # टिप्पणी 77052162_45038767 मैंने हाल ही में उत्तर दिया –

उत्तर

1

इस प्रारूप के साथ %[^\n], scanf() एक नई लाइन पढ़ने के बाद बंद हो जाता है। तो, पहले इनपुट के बाद, एक नई लाइन छोड़ी गई है जिसे उपभोग नहीं किया जाता है। तो, बाद में स्कैनफ़() कॉल किसी भी इनपुट को नहीं पढ़ते हैं।

%[^\n] में 0 स्पेस के साथ, scanf() किसी भी प्रकार के व्हाइटस्पेस वर्णों को अनदेखा करता है। इसलिए, scanf() बचे हुए न्यूलाइन को अनदेखा करता है। scanf से:

white-space वर्णों का एक क्रम (अंतरिक्ष, टैब, न्यू लाइन, आदि .; isspace देखना (3))। यह निर्देश इनपुट में किसी भी सहित सफेद स्पेस, से मेल खाता है।

वैसे, आपको प्रारूप स्ट्रिंग के अंत में उस अतिरिक्त s की आवश्यकता नहीं है।

fgets() का उपयोग करें जो आमतौर पर scanf() (fgets() से बेहतर होता है यदि अंतरिक्ष है तो बफर में न्यूलाइन चार पढ़ेगा)। यह भी देखें: Why does everyone say not to use scanf? What should I use instead?

+0

Thnxxx सब मैं अब समझता हूं ... वास्तव में धन्यवाद – ammasum

2

सबसे पहले, अनुगामी s%[ फॉर्मेट स्पेसिफायर की हिस्सा नहीं है, तो यह हटाने और %[^\n] के बारे में बात करने देता है।

अब, क्या %[^\n]scanf बताता है क्या करने के लिए सब कुछ स्कैन है एक नई पंक्ति वर्ण ('\n') या EOF, जो भी पहले हो, और यह भंडार उसके संगत तर्क में, इस मामले में, arr में जब तक।

और यहाँ कमी है: %[^\n] विफल रहता है पहले अक्षर पढ़ने के लिए एक \n है।

' प्रतीक्षा', आप कहते हैं। 'मैंने एक अकेला प्रवेश नहीं किया था। तो, यह क्यों विफल रहा? '। सच। तुमने नहीं। लेकिन दर्ज करें जो आपने पिछली पंक्ति के लिए दबाया था? पता चला है, scanf करने के लिए पिछले कॉल \n जब तक सब कुछ पकड़ लेता है, \n छोड़ देता है वहाँ और रिटर्न। तो, पाश की अगले चरण में, scanf इस \n चरित्र scanf करने के लिए पिछले कॉल से बचे देखता है, विफल रहता है और रिटर्न 0.

अंतरिक्ष के लिए के रूप में, यह एक खाली स्थान के चरित्र है।और scanf में एक व्हाइटस्पेस चरित्र पहले गैर-व्हाइटस्पेस चरित्र तक सभी व्हाइटस्पेस वर्णों को स्कैन और त्यागने के लिए निर्देश देता है। इसलिए, यह \n हटा देता है (क्योंकि यह एक व्हाइटस्पेस चरित्र है) और scanf आगे इनपुट के लिए प्रतीक्षा करेगा।

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