2011-01-20 12 views
6

है इसलिए मैं सी के लिए नया हूं और इस चेतावनी के साथ क्या हो रहा है इसके साथ समस्या हो रही है। चेतावनी का मतलब क्या है और मैं इसे कैसे ठीक कर सकता हूं। कोड मैं लिखा था यहाँ है:चेतावनी: प्रारूप '% d' प्रकार 'int *' की अपेक्षा करता है, लेकिन तर्क 2 में 'int'

void main(void) 
{ 
    char* name = ""; 
    int age = 0; 
    printf("input your name\n"); 
    scanf("%s\n", name); 
    printf("input your age\n"); 
    scanf("%d\n", age); 
    printf("%s %d\n", name, age); 

} 

उत्तर

9

scanf समारोह में परिणाम डाल करने के लिए एक चर के पता लेता है।
लेखन scanf("%d", &someVar)वैरिएबल यूनरी ऑपरेटर का उपयोग कर पते को पार करेगा।
scanf फ़ंक्शन उस पते पर स्मृति के टुकड़े में एक संख्या को छोड़ देगा। (जो आपके चर शामिल हैं)

जब आप scanf("%d", age) लिखते हैं, आप scanf को age चर के मूल्य गुजरती हैं। यह 0 (age0) के बाद मेमोरी के टुकड़े में एक संख्या ड्रॉप करने का प्रयास करेगा, और बहुत गड़बड़ हो जाएगी।

आपको &age से scanf पास करने की आवश्यकता है।

char name[100]; 
scanf("%99s\n", name); 
1

आप scanf("%d", &age) लिखना चाहिए, के रूप में scanf समारोह को, age का मूल्य की जरूरत है संशोधित इसलिए पारित करने के लिए की जरूरत है:

तुम भी scanf के लिए स्मृति को आबंटित करने name में एक स्ट्रिंग पढ़ने की जरूरत है यह "पते से" और "मूल्य से" नहीं है।

0

इसका मतलब है कि यह एक "int *" (वह है: एक पूर्णांक के लिए एक सूचक) की उम्मीद है, लेकिन आप इसे "int" देते हैं जो एक पूर्णांक है। इसे ठीक करने के लिए स्कैनफ लाइन में उम्र के लिए & जोड़ें ताकि यह बन जाए।

स्कैनफ़ ("% d \ n", आयु);

0

मैं लाइन scanf("%d\n", age); लाइन के बारे में शिकायत कर रहा हूं यह मुद्दा यह है कि स्कैन एफ आपके चर के लिए एक सूचक को चर नहीं देता है। आपको '&' को लंबित करके चर के लिए एक पता प्राप्त करने की आवश्यकता है और आपको ठीक होना चाहिए।

0

चेतावनी वास्तव में इसका मतलब है कि यह क्या कहते हैं: संकलक int बजाय scanf कॉल में एक int के लिए सूचक की उम्मीद है।

त्वरित फ़िक्स: &age के साथ प्रतिस्थापित करें, और सब कुछ काम करेगा।

सी सभी तर्कों को मूल्य से गुजरता है, जिसका अर्थ है कि यदि आप एक चर को पास करते हैं तो केवल चर का मान पास हो जाता है। प्राप्त करने वाला फ़ंक्शन उस मान को संशोधित कर सकता है जो वह चाहता है, लेकिन मूल मान परिवर्तित नहीं होता है। परिवर्तनीय को बदलने के लिए, आपको किसी वैल्यू को इंगित करने की आवश्यकता होती है जो किसी भी प्रकार परिवर्तनीय को इंगित करती है, जिसमें सी एक सूचक है।

एक चर के लिए सूचक प्राप्त करने के लिए, इसे & के साथ उपसर्ग करें। एक चर का उपयोग करने के लिए आपको पॉइंटर मिला है, पॉइंटर मान को * के साथ उपसर्ग करें।

इस मामले में, आप age के मान को बदलने के लिए चाहते हैं, तो आपको इसे एक सूचक पास करना होगा। थोड़ा या स्मृति इतना बड़ा एक भी अशक्त चरित्र धारण करने के लिए पर

0
char* name = ""; 

name अंक।

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

आप इस पते पर पढ़ने और संग्रहीत करने के लिए अज्ञात संख्या के पात्रों के लिए पूछते हैं। कुछ भी हो सकता है। सुनिश्चित करना चाहिए nameकुछ भीscanf() को पढ़ने के लिए पर्याप्त स्मृति की एक बड़ी संख्या का पता लगाना चाहिए।

char twenty_bytes[20] = ""; 
scanf("%s\n", twenty_bytes); 
6

समस्या इस लाइन है:

scanf("%d\n", age); 

scanf सूचक तर्क की उम्मीद है - यह एक ही तरीका है की कार्य यह एक ठीक करने के लिए में सी में पैरामीटर संशोधित कर सकते हैं है, तो आप की जरूरत है:

scanf("%d\n", &age); 

जो उम्र के पते को पास करता है, जो अब एक सूचक है (एक सूचक एक चर है जिसमें स्मृति के दूसरे क्षेत्र में एक पता होता है)।

इस के लिए के रूप में:

char* name = ""; 

आउच-ow-कृपया-नहीं है! ठीक है, मुझे समझाने की जरूरत है। आपने एक चरित्र प्रकार के लिए एक सूचक के लिए कहा है, लेकिन जहां तक ​​सभी का संबंध है, आपको बस एक चरित्र है, पूरी स्ट्रिंग नहीं। यह सही है, पर्याप्त जगह नहीं है। सी आपको ऐसा क्यों करने देता है? खैर, सी मूल रूप से पोर्टेबल असेंबलर है, इसलिए आप स्मृति में जहां भी चाहें लिख सकते हैं (या बल्कि, आप कोशिश कर सकते हैं और कंपाइलर असहमत नहीं होगा, लेकिन ऑपरेटिंग सिस्टम संभवतः कर सकता है)।

आपको कुछ जगह आवंटित करने के लिए malloc का उपयोग करके स्मृति आवंटन पर पढ़ने की आवश्यकता है, अन्यथा मैं एक विशाल स्ट्रिंग इनपुट कर सकता हूं और इसे नाम के पते पर रखा जाता है।

यह किसी भी तरह से, ढेर-आधारित भेद्यता का कारण बन सकता है। क्या, ढेर? हां। एक ढेर एक फिलो संरचना है और हर बार जब आप कोई फ़ंक्शन कॉल करते हैं, तो आप अपने रिटर्न पते और फ़ंक्शन तर्कों के साथ-साथ अक्सर फ़ंक्शन-स्कोप चर के लिए स्टैक पर स्थान जोड़ते हैं।

यह समस्या बन जाती है यदि आप इनपुट आकार की जांच नहीं करते हैं। फिर, मैं निष्पादन योग्य कोड सहित आपके ढेर में भारी मूल्य लिख सकता हूं ... Buffer Overflow देखें।

तो मैं इसे कैसे कम कर सकता हूं, मैंने सुना है, बस सॉफ़्टवेयर भेद्यता को लागू नहीं करने की इच्छा है? आप उन फ़ंक्शंस का उपयोग करते हैं जो आपको अपने बफर इनपुट आकार को निर्दिष्ट करने और विशिष्ट आकार के बफर में पढ़ने की अनुमति देते हैं, और वहां से जाते हैं। बस। यह सरल है।

यह प्रश्न देखें: string reading in C

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

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