2011-02-18 14 views
7

मुझे कमांड लाइन के माध्यम से पैरामीटर में गुजरने के बारे में एक सवाल है।सी में कमांड लाइन तर्क से "स्ट्रिंग" को कैसे पढ़ा जाए?

मेरे main() दिखेगा

int main(int argc, char **argv){ 
    int b, d, n, flag; 
    char *init_d, tst_dir[100]; 

    argv++; 
    init_d=*(argv++); 
    //printf(); <--------What do I have to do to init_d so that I can print it later? 

तो argv संकेत की एक सरणी मैं मूल्य argv अंक के सूचक द्वारा की ओर इशारा किया जा रहा है को इंगित करने के init_d बताए कर रहा हूँ करने के लिए एक सूचक है? (यदि यह भी समझ में आता है)

मुझे लगता है कि मुझे इसे मुद्रित करने के लिए उस मान को एक वर्ण सरणी में प्राप्त करना होगा, लेकिन अगर मुझे "स्ट्रिंग" का आकार पता नहीं है, तो मैं हूं यह सुनिश्चित नहीं है कि इसे कैसे प्राप्त किया जाए। उदाहरण के लिए यदि मैं './myprogram aserinput'

+0

ठीक है धन्यवाद सब लोग मैं अपनी मूर्खता के लिए माफी माँगता मैं विभाजन दोष हो रही है, लेकिन मैं क्यों अब देखते हैं। – mike

+1

सी एक क्रूर मास्टर है! –

उत्तर

12

की तुलना में अपना कोड './myprogram हैलो' चलाता हूं, तो आप उन्हें वर्ण सरणी में स्थानांतरित किए बिना तर्क मुद्रित कर सकते हैं। वे अशक्त-समाप्त सी तार कर रहे हैं और printf नाश्ते के लिए उन्हें खाती है:

for (i=0; i<argc; i++) 
    printf("%s\n", argv[i]); 
+0

ठीक है, मैं तुरंत तर्कों को मुद्रित नहीं करना चाहता हूं, मुझे एक चर में पारित मान को संग्रहीत करने की आवश्यकता है जिसे मैं बाद में एक फ़ंक्शन – mike

+0

@ माइक ओके में प्रिंट करना चाहता हूं, उन्हें दूर सहेजें।ओएस 'argv' के लिए जगह आवंटित करता है और चूंकि आपका पूरा प्रोग्राम' मुख्य 'के अंदर निहित है और जो भी इसे कॉल करता है, स्मृति अवधि के लिए मान्य होगी। –

2
int main(int argc, char **argv){ 

    while(--argc>0) 
     printf("%s\n",*++argv); 
    return 0; 
} 

argc: argument count i.e. number of arguments in command line 
argv: argument vector 

यदि आपका कार्यक्रम है myProg तो कमांड लाइन में myProg hello है argc = 2, argv (प्रोग्राम का नाम भी शामिल है) [0] है " myProg हैलो ", और argv [1] है" "

0

आप कर सकते हैं उत्पादन स्ट्रिंग आप

printf("%s", init_d); 

के साथ कम से init_d साथ ओर इशारा करते हुए"% s "उत्पादन के सभी पात्रों स्ट्रिंग जब तक यह '\ 0' तक नहीं पहुंच जाता है। सी में, तारों को निरस्त कर दिया जाता है।

2

(आवश्यक नहीं कोष्ठक, btw)

init_d = *(argv++); 

चलाने के बाद, init_d एक चरित्र के लिए सूचक है। सी में, एक स्ट्रिंग एक वर्ण सूचक होता है जो अनुबंध का पालन करता है कि यदि यह काफी उन्नत है, तो अंततः एक शून्य वर्ण ('\ 0') तक पहुंच जाएगा, स्ट्रिंग के अंत को दर्शाता है। दूसरे शब्दों में, init_d अब ठीक स्ट्रिंग जो आप चाहते हैं। आप के साथ

printf("%s", init_d); 

ध्यान दें, btw, कि * argv ++ आप argv का पहला तत्व है, जो वास्तव कमांड लाइन पर समारोह का नाम है दे रहा है इसे प्रिंट कर सकते हैं। आप शायद पहले कमांड लाइन तर्क चाहते हैं, जिसे आप * ++ argv के साथ प्राप्त करेंगे।

+0

आपने अपना 'argv ++;' याद किया है, जो पहले ही कमांड नाम छोड़ देता है। –

1

argv शून्य-समाप्त तारों की एक सरणी के लिए एक सूचक है। आपको स्ट्रिंग के आकार को जानने की आवश्यकता नहीं है; आपको केवल इतना करना है कि स्ट्रिंग के अंत को '\ 0' के साथ इंगित किया गया है।

char* init_d = argv[0]; 
printf("%s", init_d); 

आप स्ट्रिंग आप strlen(argv[0]) इस्तेमाल कर सकते हैं की लंबाई पता करने के लिए करना चाहता था तो।

3

यहाँ उदाहरण है कि एक स्ट्रिंग के लिए आदेश पंक्ति तर्क परिवर्तित करता है:

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

int main(int argc, char *argv[]) { 
    if (argc < 1) 
     return 0; 

    int i; 
    int strsize = 0; 
    for (i=1; i<argc; i++) { 
     strsize += strlen(argv[i]); 
     if (argc > i+1) 
      strsize++; 
    } 

    printf("strsize: %d\n", strsize); 

    char *cmdstring; 
    cmdstring = malloc(strsize); 
    cmdstring[0] = '\0'; 

    for (i=1; i<argc; i++) { 
     strcat(cmdstring, argv[i]); 
     if (argc > i+1) 
      strcat(cmdstring, " "); 
    } 

    printf("cmdstring: %s\n", cmdstring); 

    return 0; 
} 
संबंधित मुद्दे