2012-03-19 23 views
10

में परिवर्तित नहीं हो रहा है किसी कारण से मेरा सी प्रोग्राम इनवर्ट्स के तत्वों को इनट्स में परिवर्तित करने से इंकार कर रहा है, और मैं यह नहीं समझ सकता कि क्यों।चार int

int main(int argc, char *argv[]) 
{ 

    fprintf(stdout, "%s\n", argv[1]); 

    //Make conversions to int 
    int bufferquesize = (int)argv[1] - '0'; 

    fprintf(stdout, "%d\n", bufferquesize); 
} 

और यह उत्पादन जब 50 ./test चल रहा है:

-1076276207

मैं (int) को बाहर निकालने की कोशिश की है, फेंकने दोनों एक * और एक & बीच (int) और argv [1] - पूर्व ने मुझे 5 दिया लेकिन 50 नहीं, लेकिन बाद वाले ने मुझे उपरोक्त के समान आउटपुट दिया। - '0' ऑपरेशन को हटाने से ज्यादा मदद नहीं मिलती है। मैंने एक char first = argv [1] बनाने की कोशिश की और इसके बजाय रूपांतरण के लिए पहले उपयोग किया, और यह अजीब रूप से पर्याप्त इनपुट के बावजूद मुझे 17 दिया।

मैं बेहद उलझन में हूं। क्या हो रहा है?

+0

मुझे लगता है कि आप का अर्थ हो सकता है 'argv [1] [0] '(प्रकार' char') <- पहला तर्क (निष्पादन नाम के बाद) का पहला अक्षर। बेशक, अभी भी इसके साथ कोई जांच नहीं है और बेहतर तरीके हैं।"त्रुटि को दूर करने" की कोशिश न करें (जैसे 'argv [1]' को 'char *' के रूप में टाइप किया गया है) क्योंकि यह अक्सर काम नहीं करता है :-) –

उत्तर

12

argv[1] एक char * नहीं एक char है आप एक char * एक int को परिवर्तित नहीं कर सकते। यदि आप argv [1] में पहले अक्षर को एक int में बदलना चाहते हैं जो आप कर सकते हैं।

int i = (int)(argv[1][0] - '0'); 

मैं सिर्फ इस

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

int main(int argc, char **argv) { 
    printf("%s\n", argv[1]); 

    int i = (int)(argv[1][0] - '0'); 

    printf("%d\n", i); 
    return 0; 
} 

लिखा था और इस

./testargv 1243 

है जैसे कि यह भाग गया और

1243 
1 
+0

आपने अपना संदर्भ atoi पर गिरा दिया ... क्यों? – FrankieTheKneeMan

+0

@ फ्रैंकी TheKneeMan मैं कभी भी atoi का उपयोग नहीं कर रहा था। यदि आप चाहें तो इसका इस्तेमाल कर सकते हैं लेकिन मेरा जवाब कभी नहीं था। हालांकि स्कॉट हंटर का जवाब इसका उपयोग करता है। – twain249

+0

हू। मुझे लगता है कि मैं गलत पढ़ता हूँ। – FrankieTheKneeMan

52

atoi(argv[1]) ("ascii to int") का उपयोग करने का प्रयास करें।

+10

यह चयनित उत्तर होना चाहिए। – RyanB

+1

यह ठीक है। atoi() समारोह इसके लिए बनाया गया था। –

3

तुम सिर्फ एक char* int करने के लिए कन्वर्ट करने के लिए कोशिश कर रहे हैं मिल गया, जो निश्चित रूप से ज्यादा समझ में नहीं आता है। ,,

int bufferquesize = 0; 
for (int i = 0; argv[1][i] != '\0'; ++i) { 
    bufferquesize *= 10; bufferquesize += argv[1][i] - '0'; 
} 

इसमें यह माना जाता है लेकिन है कि आपके char* साथ '\ 0' है, जो यह होना चाहिए समाप्त हो जाती है, लेकिन शायद ऐसा करने के लिए नहीं है: आप शायद लगता है कि यह सब करने की ज़रूरत।

+1

असल में यह 'char's * की सरणी मानता है कि आपके' char * 'अंक * '\ 0'' के साथ समाप्त होते हैं। क्या पॉइंटर "\" '' में समाप्त होता है (क्या इसका मतलब क्या होगा? इसका प्रतिनिधित्व 0 बाइट में समाप्त होता है?) कोई मुद्दा नहीं है। –

+0

, पाठ्यक्रम। "वाक्य के लिए 'पॉइंटर' समाप्त होता है एक निश्चित प्रतीक "बस समझ में नहीं आता है। सुधार के लिए धन्यवाद। :) –

2

(प्रकार) प्रकारों को कास्ट करने के लिए मौजूद है - एक प्रोग्राम को स्मृति का एक टुकड़ा दिखने के तरीके को बदलने के लिए। विशेष रूप से, यह चरित्र '5' के बाइट एन्कोडिंग को पढ़ता है और इसे स्मृति में स्थानांतरित करता है। एक char * वर्णों की एक सरणी है, और वर्ण एक बाइट हस्ताक्षरित पूर्णांक हैं। argv[1] पहले चरित्र को इंगित करता है। सी में संकेत की एक त्वरित विवरण के लिए here की जाँच करें तो अपने "स्ट्रिंग" स्मृति में प्रतिनिधित्व किया है के रूप में:

['5']['0'] 

जब आप

int i = (int) *argv[1] 

डाली आप केवल एक पूर्णांक के लिए पहला तत्व कास्टिंग कर रहे हैं , इस प्रकार आप

जो फ़ंक्शन आप खोज रहे हैं वह स्कॉट हंटर, या strtol() द्वारा उल्लिखित atoi() है, जिसे मैं अपनी त्रुटि का पता लगाने के व्यवहार के कारण पसंद करता हूं।