जवाबों:
अन्य उत्तरों के अनुसार, यह ठीक है:
char c = '5';
int x = c - '0';
इसके अलावा, त्रुटि की जाँच के लिए, आप जाँच सकते हैं कि isdigit (c) पहले सत्य है। ध्यान दें कि आप अक्षरों के लिए पूरी तरह से वही नहीं कर सकते हैं, उदाहरण के लिए:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
मानक गारंटी देता है कि अंक '0' से '9' के लिए वर्ण मान सन्निहित हैं, लेकिन वर्णमाला के अक्षरों जैसे अन्य वर्णों के लिए कोई गारंटी नहीं देता है।
इस तरह '0' घटाएँ:
int i = c - '0';
C मानक की सीमा में प्रत्येक अंक की गारंटी '0'..'9'उसके पिछले अंक ( C99 ड्राफ्ट के अनुभाग 5.2.1/3में ) से एक अधिक है । C ++ के लिए भी यही मायने रखता है।
यदि, कुछ पागल संयोग से, आप वर्णों के एक स्ट्रिंग को पूर्णांक में बदलना चाहते हैं , तो आप ऐसा भी कर सकते हैं!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
valअब 1024 है। जाहिरा तौर atoi()पर ठीक है, और मैंने इसके बारे में जो पहले कहा था वह केवल मुझ पर लागू होता है (ओएस एक्स पर (शायद (यहां लिस्प मजाक डालें))। मैंने सुना है कि यह एक मैक्रो है जो अगले उदाहरण के लिए लगभग मैप करता है strtol(), जो रूपांतरण करने के लिए एक अधिक सामान्य-प्रयोजन फ़ंक्शन का उपयोग करता है :
char *num = "1024";
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long
strtol() इस तरह काम करता है:
long strtol(const char *str, char **endptr, int base);
यह *strएक को अभिसरण करता है long, यह मानकर कि यह आधार baseसंख्या है। यदि **endptrयह अशक्त नहीं है, तो यह पहला गैर-अंक वर्ण strtol()पाया गया है (लेकिन जो इस बारे में परवाह करता है)।
itoa_s()।
घटाव चार '0' या इंट 48 इस तरह है:
char c = '5';
int i = c - '0';
स्पष्टीकरण: आंतरिक रूप से यह ASCII मूल्य के साथ काम करता है । ASCII तालिका से, वर्ण 5 का दशमलव मान 53 है और 0 48 है । तो 53 - 48 = 5
या
char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48
इसका मतलब है कि यदि आप किसी अंक वर्ण से 48 घटाते हैं , तो यह पूर्णांक को स्वचालित रूप से परिवर्तित कर देगा।
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
numeralChar - '0'पहले से ही प्रकार का है int, इसलिए आपको कलाकारों की आवश्यकता नहीं है। यहां तक कि अगर यह नहीं था, कलाकारों की जरूरत नहीं है।
वर्ण अंक को संबंधित पूर्णांक में बदलने के लिए। जैसा कि नीचे दिखाया गया है:
char c = '8';
int i = c - '0';
ऊपर की गणना के पीछे तर्क ASCII मूल्यों के साथ खेलना है। वर्ण 8 का ASCII मान 56 है, वर्ण 0 का ASCII मान 48 है। पूर्णांक 8 का ASCII मान 8 है।
यदि हम दो वर्णों को घटाते हैं, तो घटाव ASCII वर्णों के बीच होगा।
int i = 56 - 48;
i = 8;
यदि यह ASCII में केवल एक ही वर्ण 0-9 है, तो ASCII शून्य मान को ASCII मान से घटाकर ठीक काम करना चाहिए।
यदि आप बड़ी संख्या में रूपांतरित करना चाहते हैं तो निम्न कार्य करेंगे:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** स्थिति की जांच करना न भूलें (जो उपरोक्त मामले में काम करने पर 1 होना चाहिए)।
पॉल।
जब मुझे ऐसा कुछ करने की आवश्यकता होती है, तो मैं अपने इच्छित मूल्यों के साथ एक सरणी देता हूं।
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
फिर रूपांतरण आसान है
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
यह मूल रूप से ctype लाइब्रेरी के कई कार्यान्वयनों द्वारा लिया गया दृष्टिकोण है। आप तुच्छ रूप से हेक्स अंकों के साथ भी काम करने के लिए इसे अनुकूलित कर सकते हैं।
यदि आपका अंक है, तो कहें, '5'ASCII में इसे बाइनरी नंबर 0011 0101(53) के रूप में दर्शाया गया है । हर अंक में चार बिट्स होते हैं 0011और सबसे कम 4 बिट्स एलसीडी में डिजिट का प्रतिनिधित्व करते हैं। तो तुम बस करो
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
सबसे कम 4 बिट प्राप्त करने के लिए, या, इसके समान, अंक क्या है। Asm में, यह (अन्य उत्तरों की तरह) के andबजाय ऑपरेशन का उपयोग करता है sub।
'5'53 है ( 00110101)
यहाँ सहायक कार्य हैं जो अंक को चार में अंतर में बदलने की अनुमति देते हैं और इसके विपरीत:
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}
समारोह का उपयोग करें: सरणी के लिए पूर्णांक के लिए सरणी, फ्लोट प्रकार के लिए सरणी के लिए; या
char c = '5';
int b = c - 48;
printf("%d", b);