2011-01-25 23 views
17

मैं a getopt() example पढ़ा है लेकिन यह कैसे तर्क विकल्प के रूप में पूर्णांकों स्वीकार करने के लिए, की तरह cvalue उदाहरण से कोड में होगा प्रदर्शित नहीं करता है:कमांड लाइन तर्क के रूप में पूर्णांक कैसे लेते हैं?

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

int 
main (int argc, char **argv) 
{ 
    int aflag = 0; 
    int bflag = 0; 
    char *cvalue = NULL; 
    int index; 
    int c; 

    opterr = 0; 

    while ((c = getopt (argc, argv, "abc:")) != -1) 
    switch (c) 
     { 
     case 'a': 
     aflag = 1; 
     break; 
     case 'b': 
     bflag = 1; 
     break; 
     case 'c': 
     cvalue = optarg; 
     break; 
     case '?': 
     if (optopt == 'c') 
      fprintf (stderr, "Option -%c requires an argument.\n", optopt); 
     else if (isprint (optopt)) 
      fprintf (stderr, "Unknown option `-%c'.\n", optopt); 
     else 
      fprintf (stderr, 
        "Unknown option character `\\x%x'.\n", 
        optopt); 
     return 1; 
     default: 
     abort(); 
     } 

    printf ("aflag = %d, bflag = %d, cvalue = %s\n", 
      aflag, bflag, cvalue); 

    for (index = optind; index < argc; index++) 
    printf ("Non-option argument %s\n", argv[index]); 
    return 0; 
} 

अगर मैं भाग गया के रूप में testop -c foo ऊपर, cvalue होगा foo, लेकिन अगर मैं testop -c 42 चाहता था तो क्या होगा? चूंकि cvaluechar * प्रकार है, तो क्या मैं optarg(int) पर जा सकता हूं? मैंने getopt() का उपयोग किए बिना इसे करने का प्रयास किया है और सीधे argv[whatever] तक पहुंच रहा है, और इसे पूर्णांक के रूप में कास्टिंग किया है, लेकिन %d के साथ प्रिंट करते समय मैं हमेशा एक बड़ी नकारात्मक संख्या के साथ समाप्त होता हूं। मुझे लगता है कि मैं argv[] को सही ढंग से या कुछ निश्चित रूप से संदर्भित नहीं कर रहा हूं ...

उत्तर

34

स्ट्रिंग से पूर्णांक में कनवर्ट करने के लिए आपको atoi() का उपयोग करने की आवश्यकता है।

4

atoi का उपयोग करें।

cvalue = atoi(optarg); 

और int के रूप में cvalue घोषित करें।

1

इस स्थिति में मैं sscanf() के लिए जाऊंगा।

0

नहीं, आप इसे एक पूर्णांक मान में परिवर्तित करने के लिए नहीं डाले जा सकते हैं। आपको sscanf, atoi, atol या इसी तरह के फ़ंक्शन का उपयोग करके इसे बदलने की आवश्यकता है।

10

आप पहले से ही अपने कोड में इस्तेमाल किया है के रूप में, main समारोह के लिए प्रोटोटाइप

int main (int argc, char** argv)

क्या कभी तर्क आदेश पंक्ति तर्क के रूप में प्रदान की जाती हैं, वे की एक सरणी के रूप में अपने 'कार्यक्रम' के लिए पारित कर रहे हैं चार * (या बस तार)। इसलिए यदि आप foo.exe 123 के रूप में एक prog आह्वान, foo.exe को पहले तर्क एक स्ट्रिंग 123 और 123

की नहीं एक पूर्णांक मूल्य आप तर्क पूर्णांक कास्टिंग प्रयास करते हैं (जैसा कि आप ने कहा कि) शायद जैसे कुछ बात का उपयोग करेंगे: (int) argv[1], आपको पहले तर्क का पूर्णांक मान नहीं मिलेगा, लेकिन कुछ स्मृति पता जहां आपका पता स्थान पर पहला तर्क संग्रहीत किया जाता है। एक पूर्णांक मान प्राप्त करने के लिए, आपको स्ट्रिंग मान को पूर्णांक मान में स्पष्ट रूप से परिवर्तित करना होगा। इसके लिए, आप atoi फ़ंक्शन का उपयोग कर सकते हैं। रूपांतरण के लिए उपयोग किए जा सकने वाले समान कार्यों के लिए THIS मैन पेज देखें।

16

उपर्युक्त सभी उत्तर व्यापक रूप से सही हैं (विक्रम.एक्सई समझाए जाने के लिए प्रोप प्राप्त करता है क्यों आपको लाइब्रेरी फ़ंक्शन को कॉल करना होगा, जिसे कोई और करने के लिए परेशान नहीं है)। हालांकि, किसी ने भी कॉल करने के लिए सही लाइब्रेरी फ़ंक्शन का नाम दिया है। atoi का उपयोग न करें। sscanf का उपयोग न करें।

strtol, या इसके रिश्तेदार strtoul का उपयोग करें यदि आप नकारात्मक संख्याओं को अनुमति नहीं देना चाहते हैं। इनपुट केवल कोई संख्या नहीं होने पर केवल इन फ़ंक्शंस आपको पर्याप्त जानकारी देते हैं। उपयोगकर्ता प्रकार

./a.out 123cheesesandwich 

atoi और sscanf cheerfully 123 है, जो लगभग निश्चित रूप से आप क्या नहीं करना चाहता है वापस आ जाएगी उदाहरण के लिए, यदि।केवल strtol आपको बताएगा (endptr के माध्यम से) कि यह केवल स्ट्रिंग के पहले कुछ अक्षर संसाधित करता है।

4

atoi() जिसका अर्थ पूर्णांक तक ascii समारोह का उपयोग करने के लिए है (कोई strtoi है, लेकिन वहां strtod है अगर आप एक फ्लोटिंग प्वाइंट नंबर पढ़ने की जरूरत है।),। इसी प्रकार, atof() फ्लोट मान प्राप्त करने के लिए उपयोग किया जा सकता है।

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