2015-06-10 4 views
5

मैंने हाल ही में एक सरल कार्यक्रम लिखा है जहां मैं गलती से कंसोल पर एक संदेश प्रदर्शित करने के लिए printf() के बजाय scanf() का उपयोग करता हूं। मैं संकलन समय त्रुटि प्राप्त करने की उम्मीद कर रहा था, लेकिन यह रनटाइम पर & दुर्घटनाओं के बिना ठीक संकलित करता है। मुझे पता है कि कीबोर्ड से इनपुट लेने के लिए scanf() का उपयोग किया जाता है। क्या मुझे प्रोग्राम में कोई त्रुटि नहीं मिलनी चाहिए?स्कैनफ() को स्ट्रिंग पास क्यों करना सी में ठीक संकलित करता है?

#include <stdio.h> 
int main() 
{ 
    scanf("Hello world"); // oops, It had to be printf() 
    return 0; 
} 

क्या यह अपरिभाषित व्यवहार (यूबी) का आह्वान करता है? सी मानक में इसके बारे में कोई उल्लेख है? संकलन समय पर इसकी जांच क्यों नहीं की जाती है कि उचित & वैध तर्क स्कैनफ़() फ़ंक्शन में पास किए गए हैं या नहीं?

+0

क्रैश पुन: उत्पन्न नहीं कर सकता है। कार्यक्रम मेरे लिए ठीक चलाता है। – EOF

+0

कोड मेरे लिए सही दिखता है, और संकलित और चलाने पर सामान्य रूप से पूरा करना चाहिए। आप इसे 'क्रैश' कैसे जानते हैं? दुर्घटना के लक्षण क्या हैं? – CiaPan

+1

मुझे यकीन है कि व्याकरण निहित है: संकलित करने में विफल होने के बिना और * बिना * क्रैशिंग –

उत्तर

6

कोड सही ढंग से व्यवहार कर रहा है। दरअसल, scanf

int scanf(const char *format, ...); 

घोषित किया जाता है सौभाग्य से, अपने format किसी भी % जिसके लिए वहाँ ... में कोई पत्राचार, जो यूबी आह्वान होगा शामिल नहीं है।
आगे, format एक स्ट्रिंग अक्षर है जो संकलक को उच्च चेतावनी स्तरों के साथ सक्षम सैनिटी चेक के हिस्से के रूप में प्रारूप विनिर्देशों के संबंध में सही प्रकार के पैरामीटर पारित करने की अनुमति देता है। (-Wformat परिवार)

-1

scanf does take a string paramater। यही कारण है कि यह ठीक संकलित करता है, लेकिन ऐसा प्रतीत होता है कि आपका पैरामीटर जो अपेक्षा करता है उससे मेल नहीं खाता है, इसलिए यह रनटाइम पर क्रैश (या बस बाहर निकलता है)।

+4

मुझे वास्तव में यह दुर्घटनाग्रस्त है ... यह क्यों होगा? 'scanf' सिर्फ इनपुट से वर्ण पढ़ता है और उन्हें प्रारूप स्ट्रिंग से तुलना करता है। जब तुलना विफल हो जाती है, तो 'त्रुटि' कुछ त्रुटि के साथ वापस आती है - लेकिन 'क्रैश' नहीं होती है। – CiaPan

4

कंपाइलर आपके दिमाग को नहीं पढ़ सकता है।

printf("Hello world") और scanf("Hello world") दोनों अच्छी तरह से गठित हैं।

6

scanf के लिए एक स्ट्रिंग पासिंग, ठीक संकलित क्योंकि scanf यह पहली पैरामीटर के रूप में एक स्ट्रिंग की उम्मीद है। विस्तृत scanf विवरण के लिए प्रलेखन या प्रोग्रामिंग मैन्युअल देखें।

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