2012-08-13 8 views
6

जो भी कारण निम्नलिखित कोड प्रिंट (शून्य) के लिए:scanf गतिशील आवंटन

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    char *foo; 
    scanf("%ms", &foo); 
    printf("%s", foo); 
    free(foo); 
} 

मैं एक स्ट्रिंग गतिशील के लिए स्मृति को आबंटित करने की कोशिश कर रहा हूँ, लेकिन जैसा कि मैंने कहा कि पहले मेरा कार्यक्रम बस आउटपुट (शून्य)। मैंने गेटचे और रीलॉक का उपयोग करके एक फ़ंक्शन बनाकर काम किया लेकिन यह इस तथ्य के कारण लगभग व्यर्थ लगता है कि मुझे यह भी प्रोग्राम करना पड़ा कि क्या होगा यदि उपयोगकर्ता बैकस्पेस, टैब इत्यादि में प्रवेश करता है .. लेकिन जैसा कि मैंने कहा कि यह सिर्फ एक काम है चारों ओर और मैं नहीं बल्कि क्यों उपरोक्त कोड काम नहीं कर रहा पता होगा ...

अतिरिक्त जानकारी:

मैं Pelles सी आईडीई v7.00 उपयोग कर रहा हूँ और सी 11 मानक के साथ संकलन

+0

'% ms' क्या करना है? –

+0

@ ग्रेग एम झंडा इनपुट को शामिल करने के लिए गतिशील रूप से स्मृति आवंटित करना चाहिए। –

+3

क्या यह गैर मानक है? मुझे नहीं लगता कि मेरे 'स्कैनएफ' दस्तावेज में। –

उत्तर

9

मैं नहीं कर रहा हूँ को Draft C11 standard के अनुभाग 7.21.6.2 में देखकर (fscanf पर अनुभाग)। मेरा सुझाव है कि आप इसे से बचें औरपर कॉल करें जैसा कि आप सी 99 में करेंगे।

+2

जैसा कि आप भविष्यवाणी नहीं कर सकते कि 'स्कैनफ ("% s") के साथ आवंटित करने के लिए कितनी जगह है, मैं पूरी तरह से' स्कैनफ 'से बचने और' fgets' और 'sscanf' ' – jamesdlin

+4

'% एमएस' नोटेशन' 'स्कैनफ()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/scanf.html) में एक POSIX एक्सटेंशन है, जो कि मानक सी संस्करण के साथ ' scanf() ' –

0

% मीटर एक जीएनयू विस्तार है, जो हो सकता है क्यों यह Pelles सी

में उपलब्ध नहीं है
+4

यह केवल एक जीएनयू एक्सटेंशन की बजाय एक पॉज़िक्स एक्सटेंशन है। –

0

मैं लिनक्स 3.2.0 AMD 64 जीसीसी 4.7.2 साथ उपयोग कर रहा हूँ है। कोड का उपयोग:

char *s; 
scanf("%ms", &s); 
printf("%s", s); 
free(s); 

ठीक काम करता है लेकिन यह सफेद जगहों को स्वीकार नहीं करेगा।

स्थिर आवंटन के लिए, आप के बजाय का उपयोग कर सकते हैं:

char s[100]; 
printf("Enter string (max 99 characters): "); 
scanf("%100[^\n]s", &s); 
printf("You entered: %s\n", s); 

आशा है कि यह मदद करता है!

+0

इसके लिए खेद है लेकिन आप उसकी मदद नहीं कर रहे हैं क्योंकि यदि आप अपने 'स्कैनफ()' फ़ंक्शन को देखते हैं तो आपको निश्चित रूप से एहसास होगा कि यह गलत है ! यह 'स्कैनफ ("% एमएस", एस) होना चाहिए क्योंकि एस अपने आप में एक सूचक है! प्लीज ध्यान दें कि '' 'से पहले' '' 'नहीं है। इसके अलावा ध्यान रखें कि यदि कार्यक्रम में है तो यह कार्यक्रम में अगले 'स्कैनएफ' के लिए काम नहीं करेगा !!! उम्मीद है कि यह स्पष्ट है !!! –

+3

@ मेनिनक्स: नहीं, '% एमएस' के साथ, यह 'स्कैनफ ("% एमएस ", और एस) होना चाहिए। POSIX 'm' एक्सटेंशन आपके लिए स्ट्रिंग आवंटित करता है और इसे' s' को निर्दिष्ट करता है, जो कि 'char *' प्रकार का होना चाहिए। –

+1

@RudyVelthuis आप सही हैं! इसे इंगित करने के लिए धन्यवाद! :) –

0

रूप Arun कहते हैं, यह समाधान सही है और Meninx की राय गलत है:

char *s; 
scanf("%ms", &s); 
printf("%s", s); 
free(s); 

मैंने पढ़ लिया है 'आदमी scanf', यह कहते हैं:

एक वैकल्पिक 'm' चरित्र। इसका उपयोग स्ट्रिंग रूपांतरण (% s,% c,% [),
के साथ किया जाता है और इनपुट को पकड़ने के लिए पर संबंधित बफर आवंटित करने की आवश्यकता के कॉलर को राहत देता है: इसके बजाय, scanf() पर्याप्त आकार के बफर को आवंटित करता है, और इसी सूचक तर्क है, जो एक चार * चर (इस चर कॉल करने से पहले प्रारंभ करने की आवश्यकता नहीं है) करने के लिए एक सूचक होना चाहिए करने के लिए इस बफर के पते प्रदान करती है। कॉलर बाद में मुफ्त (3) इस बफर को अब आवश्यक होने पर चाहिए।