2012-07-30 29 views
7

क्या कोई मुझे बता सकता है कि मैं यहां क्या समझ नहीं पा रहा हूं?पास चार सरणी को तर्क के रूप में पास करें

मैं तर्क को "स्ट्रिंग" के रूप में पारित करने की कोशिश कर रहा हूं (मुझे पता है कि सी में कोई स्ट्रिंग नहीं है) ताकि मैं बाद में उस स्ट्रिंग का उपयोग अन्य कार्यों के साथ कर सकूं जैसे कि यह फ़ाइल नाम है जिसे उदाहरण के लिए पास किया जाना है। लेकिन मैं नहीं जानता कि क्यों यह इसे स्वीकार नहीं करेंगे या किस प्रकार

#include <stdio.h> 

int main (int argc, char *argv[]) 
{ 
    char *array= argv[0]; 
    foo(*array); 
} 

void foo(char *array) 
// notice the return type - it's a pointer 
{ 
    printf(array); 
} 

बहुत बहुत धन्यवाद होना चाहिए!

+0

जोड़ने के लिए है, जबकि गुजर यह foo के लिए। तो आप केवल पहले बाइट मान को पास करते हैं यदि यह एक सी स्ट्रिंग अक्षर – Lefteris

+0

है, तो आपको 'printf (s)' जैसे अभिव्यक्ति से अवगत होना चाहिए क्योंकि यह एक अनियंत्रित प्रारूप स्ट्रिंग है। – md5

उत्तर

17

आप इस तरह फ़ंक्शन को कॉल किया जाना चाहिए:

foo(array); 

क्या आप कर रहे हैं सूचक है, जो एक char देता है, जो स्ट्रिंग में पहले वर्ण है अपसंदर्भन है।

आपका printf कॉल भी इस तरह दिखना चाहिए:

printf("%s", array); 

आपके पूरे तय कोड की तरह दिखना चाहिए निम्नलिखित:

#include <stdio.h> 

void foo(char *array) 
{ 
    printf("%s", array); 
} 

int main (int argc, char *argv[]) 
{ 
    // TODO: make sure argv[1] exists 
    char *array= argv[1]; 
    foo(array); 
} 
+0

मैंने आपके जैसे एस्टरिक्स को हटा दिया, यह अभी भी काम नहीं करता है! यह कहता है: पुनर्वितरण: विभिन्न मूल प्रकार – Ryan

+0

हाँ, यह एक बिल्कुल नया मुद्दा है; गलत तरीके से 'printf' का उपयोग कर। – chris

+0

मैंने दोनों फिक्स किया, अभी भी एक ही बात कहती है और संकलित नहीं होगी! – Ryan

5

जब आप कहते हैं कि foo (*array), आप एक में सरणी खस्ताहाल रहे हैं पहले तत्व को पॉइंटर, उस तत्व को अव्यवस्थित करने के लिए, आपको पहला अक्षर दे रहा है। यही वह है जो आप फ़ंक्शन को पास करने का प्रयास कर रहे हैं। तारांकन को छोड़ दें और आपको जिस पॉइंटर की आवश्यकता है उसे क्षय करने के लिए बस array पास करें।

अन्य मुद्दा यह है कि आप printf का उपयोग नहीं कर रहे हैं। सबसे पहले, यहां एक reference है। आपको टोकन की एक स्ट्रिंग पास करने की आवश्यकता है जो संकलक को बताती है कि किस प्रकार का तर्क अगले उम्मीद की जा सकती है क्योंकि इसमें कहने का कोई तरीका नहीं है। आपके मामले में, char * की अपेक्षा करने के लिए आपकी स्ट्रिंग में "%s" होगा, और फिर आप तर्क के रूप में array पास करेंगे।

printf ("The string is %s", array); 
+0

मैंने आपके जैसा एस्टेरिक्स हटा दिया, यह अभी भी काम नहीं करता है! यह कहता है: पुनर्वितरण: विभिन्न मूल प्रकार – Ryan

+0

मैंने देखा कि आप इस बात का पुन: प्रयास करते हैं कि यह पहले कैसा था? समारोह में पारित तर्क में एक क्षुद्रग्रह होगा या नहीं? दरअसल मैंने अभी इसके साथ या इसके बिना देखा है, यह – Ryan

+0

@Ryan काम नहीं करेगा, आपको कहीं भी क्षय वाले सरणी को संदर्भित नहीं करना चाहिए। यह पहले से ही उस पॉइंटर में क्षीण हो गया है जब आपको किसी फ़ंक्शन में पारित होने की आवश्यकता होती है। – chris

1

argv, चरित्र संकेत की एक सरणी है इसका मतलब है कि argv सभी स्ट्रिंग्स जो आप कमांड लाइन तर्क के रूप में पारित कर दिया की पता स्टोर करने के लिए जा रहा है।

तो argv[0] हो जाएगा ताकि आप, पहली स्ट्रिंग के पते जो आप कमांड लाइन तर्क के रूप में पारित कर दिया देता है कि आप main समारोह में सूचक चर array में भंडारण कर रहे हैं।

अब आपको केवल foo फ़ंक्शन पर पता होना होगा, लेकिन आप उस स्ट्रिंग के पहले अक्षर को पार कर रहे हैं। उदाहरण के लिए यदि आपका पहला कमांड लाइन तर्क temp.txt है तो आप foo फ़ंक्शन t पर जा रहे हैं। तो foo फ़ंक्शन के अंदर आपके पास char pointer variable array है, जिसमें वर्ण t के ASCII मान को असाइन किया जाएगा। और फिर आप इसे printf पर पास कर रहे हैं, जो ASCII मान को पते के रूप में चलाएगा, और यह प्रिंट करने के लिए उस पते तक पहुंचने का प्रयास करेगा जो क्रैश (अप्रत्याशित व्यवहार) की ओर ले जाएगा।

तो आपको नीचे दिए गए फ़ंक्शन foo पर कमांड लाइन तर्क का पता केवल पास करना होगा।

foo(array);

printf(array) - यहाँ printf स्ट्रिंग (%s) के रूप में फॉर्मेट स्पेसिफायर treads जाएगा और यह सब पता array तक यह एक अशक्त चरित्र \0 को पूरा करती है से शुरू पात्रों मुद्रित करने के लिए कोशिश करता है होगा।

लेकिन बेहतर सरणी भिन्नता printf

नीचे की तरह

printf("%s", array);

+0

उत्कृष्ट स्पष्टीकरण! धन्यवाद! – Ryan

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