2013-04-13 6 views
5

निम्नलिखित कार्यक्रम में, मैं उम्मीद करते हैं कि एक शब्द में प्रवेश करने और प्रवेश कुंजी से टकराने के बाद मैं तुरंत देखना चाहिए संदेश printf बाहर एड। हालांकि, ऐसा तब तक नहीं होता जब तक कि मैं कुछ अन्य यादृच्छिक शब्द दर्ज नहीं करता। ऐसा क्यों है?स्कैनफ़ - प्रोग्राम किसी अन्य के लिए इंतजार कर रहा है?

#include <cstdio> 
#include <cstdlib> 

using namespace std; 

char tictac[17]; 

int main() 
{ 
    scanf("%s\n", tictac); 


    printf("%s\n", tictac); 
    return 0; 
} 
+1

आप सी में नामस्थान std; 'का उपयोग नहीं करते हैं, आपको इसे C++ में भी उपयोग नहीं करना चाहिए। – sobol6803

+1

@ sobol6803 यह सी ++ में एक त्वरित प्रदर्शन के रूप में एक वास्तविक कोड के रूप में लिखा गया था :) – Novellizator

उत्तर

4

tl; dr: scanf("%s\n", tictac); के साथ आप एक स्ट्रिंग पढ़ने के लिए कह रहे हैं, इसके बाद सभी रिक्त पात्रों को अनदेखा करें और फिर एक नई पंक्ति पढ़ें। समस्या के बाद से सभी रिक्त स्थान को पहले एक से अनदेखी कर रहे हैं वहाँ पहले जो कम से कम एक गैर खाली चरित्र दर्ज करें और दूसरा इसलिए कुछ कचरा के लिए की जरूरत गैर खाली इनपुट दूसरे से पहले दर्ज करें (होना चाहिए दर्ज स्वीकार किया जाता है।)।


स्कैनफ़ के साथ \ n का उदाहरण उदाहरण है।

char x, y; 
scanf("%c", &x); 
scanf("%c", &y); 
printf("%c %c", x,y); 
इस कोड को आप देखेंगे साथ

एक चरित्र में प्रवेश करने और दर्ज सीधे printf बयान के लिए जाना जाएगा दबाने कि। ऐसा इसलिए है क्योंकि दूसरा स्कैनफ वाई में कैरिज रिटर्न (जो खुद ही एक चरित्र है) पढ़ता है।

scanf("\n%c", &y); // This is recommended to do if you have a sequence of scanfs (but not on the first one). 
यह एक आवारा गाड़ी वापसी \n साथ नजरअंदाज कर दिया जाएगा (या मेल खाने) के साथ

। और सही चरित्र y को पढ़ा जाएगा।


अब जब हम अपने कोड के लिए आते हैं

scanf("%s\n", tictac); 

%s बताता scanf जब तक यह एक blank character (space, tab or new line) पाता है पढ़ने के लिए और उसके बाद यहाँ पकड़ एक गैर रिक्त स्थान तक सभी रिक्त रिक्त स्थान की अनदेखी कर रहा है चरित्र से मुलाकात की गई है। तो अपने scanf पर ध्यान नहीं देगा दर्ज आप दबाया जब आप स्ट्रिंग में प्रवेश किया। और किसी भी खाली चरित्र है कि यह इस प्रकार है (दूसरी पंक्ति और प्रेस पर रिक्त स्थान में प्रवेश में प्रवेश की कोशिश करो।)

जिसका मतलब है यह ठीक काम करेंगे (चार संस्करण के विपरीत)

scanf("%s", tictac); 
scanf("%s", tictac2); 

असल Windows

पर "% s" पुस्तकालय का कारण बनता है क्योंकि यहतक इनपुट स्ट्रिंग को पढ़ने के लिएकुछ सफेद स्थान पाता है, बराबर फॉर्मेट स्पेसिफायर है "% [^ \ 0x20 \ t \ n]" है, जो पुस्तकालय का निर्देश स्ट्रिंग जब तक यह एक अंतरिक्ष चरित्र का सामना करना पड़ता पढ़ने के लिए (\ 0x20), एक टैब वर्ण (\ टी), या एक न्यू लाइन चरित्र (\ n)।

लेकिन जब से आप स्पष्ट रूप से कहा है कि scanf\n

scanf("%s\n", tictac); 
     ^^ 

जब तक यह एक और \n (एक गैर खाली चरित्र के बाद) हो जाता है, क्योंकि पहले एक के बाद एक %s द्वारा इस्तेमाल किया गया था यह इंतजार करेंगे मैच के लिए ।

+0

क्या आप स्कैनफ़ को और अधिक स्पष्ट कर सकते हैं? अगर मुझे यह सही स्कैनफ ("% s \ n", var) मिलता है तो पहले स्ट्रिंग (व्हाइट्स स्पेस तक) को var में पढ़ता है और स्ट्रिंग के तुरंत बाद सफेद जगहों को अनदेखा करता है (इसलिए यहां तक ​​कि मैंने जो भी प्रवेश किया है)। फिर यह नई लाइन "\ n" के लिए इंतजार कर रहा है? पीएस: मैं प्रदर्शन और कम रैम खपत के लिए cstdio का उपयोग कर रहा हूँ। – Novellizator

+0

@ नोवेलिज़ेटर यह वास्तव में यहां नई लाइन का मतलब नहीं है। इसका मतलब है प्रत्येक इनपुट के बाद 'कैरिज रिटर्न' (कीबोर्ड पर दर्ज करें) के लिए प्रतीक्षा करें। इस 'स्कैनफ ("% d% d% d", और x, &y,&z);' और 'scanf ("% d \ n% d \ n% d", और x, &y,&z);' का प्रयास करें और आप अंतर देखेंगे। –

+0

उदाहरण की कोशिश की उपर्युक्त - मैं भिन्नता नहीं देख सकता ... दोनों मामलों में मैंने सभी नंबरों को एक पंक्ति में लिखने की कोशिश की और एंटर कुंजी को मारने के लिए हर एक मूल्य दर्ज किया। किसी भी मामले में यह अलग नहीं था। – Novellizator

1

स्कैनफ़ here का एक अच्छा स्पष्टीकरण है। आपके मामले में, आपको \ n अपने स्कैनफ़ फ़ंक्शन से हटा देना चाहिए।

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