आपने scanf() और% s के साथ सटीक समस्या पर क्लिक किया है - क्या होता है जब आप नहीं जानते कि कितना इनपुट है?
यदि आप char mystring[0];
चलाने का प्रयास करते हैं, तो आपका प्रोग्राम ठीक से संकलित होगा। लेकिन आप हमेशा segfault करेंगे। आप आकार 0 की सरणी बना रहे हैं, इसलिए जब आप कुछ उस सरणी में रखने का प्रयास करते हैं, तो आप तुरंत अपनी स्ट्रिंग के लिए सीमा से बाहर निकल जाएंगे (क्योंकि कोई स्मृति आवंटित नहीं की जाएगी) - जो एक सेगफॉल्ट है।
तो, बिंदु 1: आपको हमेशा अपनी स्ट्रिंग के लिए आकार आवंटित करना चाहिए। मैं बहुत कम परिस्थितियों के बारे में सोच सकता हूं (ठीक है, कोई नहीं) जहां आप char *mystring
के बजाय char mystring[0]
कहना चाहेंगे।
अगला, जब आप स्कैनफ़ का उपयोग करते हैं, तो आप कभी भी "% s" विनिर्देशक का उपयोग नहीं करना चाहते हैं - क्योंकि यह स्ट्रिंग के आकार पर कोई सीमा-जांच नहीं करेगा। इसलिए भले ही आपने: उपयोगकर्ता से अधिक 511 वर्ण में प्रवेश करती है
char mystring[512];
scanf("%s", mystring);
अगर (के बाद से 512th \ 0 है), तो आप अपने सरणी के सीमा से बाहर जाना होगा।जिस तरह से इसे ठीक करने के लिए है:
scanf("%511s", mystring);
यह सब कहना है कि सी स्वचालित रूप से एक स्ट्रिंग आकार बदलने के लिए अगर वहाँ अधिक इनपुट से आप उम्मीद कर रहे हैं एक सुविधा नहीं है है। यह वही चीज है जो आपको मैन्युअल रूप से करना है।
इससे निपटने का एक तरीका fgets() का उपयोग कर है।
आप कह सकते हैं:
while (fgets(mystring, 512, stdin))
{
/* process input */
}
फिर आप sscanf() का उपयोग कर सकते लंबाई 5. के एक स्ट्रिंग 4 अक्षर के बाद साथ पार्स करने के लिए mystring
उपरोक्त कोड का प्रयास करें पढ़ लिए गए हैं, कि कोड बाकी इनपुट को पुनः प्राप्त करने के लिए फिर से लूप। "प्रोसेसिंग" में एक बड़ा आकार होने के लिए स्ट्रिंग को फिर से आवंटित करने के लिए कोड शामिल हो सकता है और फिर fgets() से नवीनतम इनपुट जोड़ना शामिल हो सकता है।
उपरोक्त कोड सही नहीं है - यह आपके प्रोग्राम लूप को बनाएगा और किसी भी अनंत स्ट्रिंग लम्बाई को संसाधित करेगा, इसलिए आप उस पर कुछ आंतरिक हार्ड सीमा चाहते हैं (उदाहरण के लिए, अधिकतम 10 बार लूप)।
टी जोड़ा जाना चाहिए कि% s शब्द पढ़ता है, पूरे तार नहीं। चूंकि स्कैनफ प्रारूप स्ट्रिंग रिक्त स्थान और न्यूलाइन को डिलीमीटर के रूप में उपयोग करती है।इस मामले में, इसके बजाए% c का उपयोग करें (फ़ील्ड चौड़ाई के साथ), या जैसा आपने बताया है fgets। फ़ील्ड चौड़ाई के साथ% c के मामले में, संपूर्ण बफर स्ट्रिंग को शून्य पर प्रारंभ करना याद रखें। –
कार्यक्रम हमेशा segfault नहीं होगा। वास्तव में, शायद ज्यादातर समय नहीं। आपका कार्यक्रम शायद चुपचाप टूटा जाएगा। सी सुंदर नहीं है? :-) –