C में संबंधित पूर्णांक के लिए एक वर्ण अंक परिवर्तित करें


103

क्या किसी चरित्र को C में पूर्णांक में बदलने का एक तरीका है?

उदाहरण के लिए, '5'5 से?

जवाबों:


148

अन्य उत्तरों के अनुसार, यह ठीक है:

char c = '5';
int x = c - '0';

इसके अलावा, त्रुटि की जाँच के लिए, आप जाँच सकते हैं कि isdigit (c) पहले सत्य है। ध्यान दें कि आप अक्षरों के लिए पूरी तरह से वही नहीं कर सकते हैं, उदाहरण के लिए:

char c = 'b';
int x = c - 'a'; // x is now not necessarily 1

मानक गारंटी देता है कि अंक '0' से '9' के लिए वर्ण मान सन्निहित हैं, लेकिन वर्णमाला के अक्षरों जैसे अन्य वर्णों के लिए कोई गारंटी नहीं देता है।


3
@ पाओल टॉम्बलिन: हां अंकों के लिए अक्षर नहीं, क्योंकि, जैसा कि मैंने उत्तर में कहा था, मानक '0' से '9' तक की गारंटी है, लेकिन अन्य वर्णों जैसे 'ए' से 'जेड' के लिए ऐसी गारंटी नहीं है।
क्रिस यंग

char c = 'b'; int x = c - 'a'; तब x केवल ASCII में 1 होगा?
पैन

@Pan किसी भी एन्कोडिंग में, ASCII सहित, जिसमें 'b' 'a' से 1 अधिक है। यह EBCDIC में अभी भी सही है, हालांकि यह बनाता है ('j' - 'i') == 8. 8.
क्रिस यंग

@ChrisYoung क्यों? EBCDIC में कारण, 'j' 'i' से 1 अधिक नहीं है?
पैन

2
मैं यहाँ क्या याद कर रहा हूँ जहाँ atoi का उपयोग नहीं किया जाता है?
डेनियल

41

इस तरह '0' घटाएँ:

int i = c - '0';

C मानक की सीमा में प्रत्येक अंक की गारंटी '0'..'9'उसके पिछले अंक ( C99 ड्राफ्ट के अनुभाग 5.2.1/3में ) से एक अधिक है । C ++ के लिए भी यही मायने रखता है।


1
यह उत्तर बेहतर होगा यदि आपने उल्लेख किया है कि एक चार / पहले से ही / प्रभावी रूप से एक पूर्णांक है, कार्यान्वयन परिभाषित संकेत के अल्बाइट (यानी, हस्ताक्षरित या अहस्ताक्षरित हो सकता है), और CHAR_BITS लंबा है।
अरफांगियन

मुझे यकीन है कि वास्तव में उसे मदद करता है जानने के लिए नहीं था। लेकिन क्रिस ने एक अच्छी बात की..एक ज़रूरी नहीं कि वह सन्निहित हो। मुझे इसका उल्लेख करना चाहिए था। अब वह दौड़ जीत गया है :)
जोहान्स शाउब -

1
आपका बेहतर है क्योंकि आपने अपना जवाब योग्य कर लिया है, हालांकि - क्रिस बहुत अच्छी तरह से अपना सामान बना सकता था। :)
अरफांगियन

सराहना के लिए धन्यवाद। मैं मानता हूं कि मैं सी के लिए राज्य के बारे में निश्चित नहीं था। इसलिए मैंने ऊपर देखा और 'क्योंकि मैं पहले से ही था, मैंने जवाब में संदर्भ को चिपका दिया :)
जोहान्स स्काउब -

और यह कि साहब, इसीलिए आपको मुझसे कुछ अधिक अंक मिले हैं। :)
अरफांगियन

29

यदि, कुछ पागल संयोग से, आप वर्णों के एक स्ट्रिंग को पूर्णांक में बदलना चाहते हैं , तो आप ऐसा भी कर सकते हैं!

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()पाया गया है (लेकिन जो इस बारे में परवाह करता है)।


Atoi के साथ कोई थ्रेड समस्याएँ नहीं हैं (इसमें कोई स्थैतिक डेटा नहीं है) और इसे हटाया नहीं गया है। वास्तव में यह कार्यात्मक रूप से समतुल्य है: # डेफिन एटोई (x) (int) (स्ट्रटोल ((x), NULL, 10)
इवान टेरान

5
Atoi के साथ मुद्दा यह है कि यह 0 का उपयोग करता है "के रूप में यहाँ एक नंबर नहीं मिल सकता है" मूल्य, इसलिए atoi ("0") और atoi ("एक") दोनों वापस लौटें 0. यदि वह आपके लिए काम नहीं करता है ' इसके लिए फिर से उपयोग करें, स्ट्रेटोल () या sscanf () देखें।
डेविड थॉर्नले

स्ट्रेटोल का अन्य लाभ, निश्चित रूप से, आपको अच्छी तरह से उसी स्ट्रिंग से अन्य चीजों को पढ़ने की आवश्यकता हो सकती है जो संख्या के बाद आती हैं।
फ़्यूचर

@EvanTeran दुर्भाग्य से यदि आप विजुअल स्टूडियो चलाते हैं तो आपको एक मूल्यह्रास चेतावनी मिलती है (और विकलांगों के बिना संकलन नहीं किया गया)। वीएस अब सिफारिश करता है itoa_s()
साइमन

7

घटाव चार '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 घटाते हैं , तो यह पूर्णांक को स्वचालित रूप से परिवर्तित कर देगा।


6
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');

numeralChar - '0'पहले से ही प्रकार का है int, इसलिए आपको कलाकारों की आवश्यकता नहीं है। यहां तक ​​कि अगर यह नहीं था, कलाकारों की जरूरत नहीं है।
आलोक सिंघल

हुह, हाँ, कि मोटे हो जाएगा, यह नहीं होगा? शायद जावा ने मेरी धारणाओं को रंग दिया है। या शायद मैं पूरी तरह से गलत हूँ और यह जावा में भी ज़बरदस्ती करेगा। :)
केविन कोनर

5

वर्ण अंक को संबंधित पूर्णांक में बदलने के लिए। जैसा कि नीचे दिखाया गया है:

char c = '8';                    
int i = c - '0';

ऊपर की गणना के पीछे तर्क ASCII मूल्यों के साथ खेलना है। वर्ण 8 का ASCII मान 56 है, वर्ण 0 का ASCII मान 48 है। पूर्णांक 8 का ASCII मान 8 है।

यदि हम दो वर्णों को घटाते हैं, तो घटाव ASCII वर्णों के बीच होगा।

int i = 56 - 48;   
i = 8;

मैं इसे अपग्रेड करने वाला एकमात्र व्यक्ति क्यों हूं? स्पष्टीकरण इतना सरल और
ज्ञानवर्धक है

0

यदि यह ASCII में केवल एक ही वर्ण 0-9 है, तो ASCII शून्य मान को ASCII मान से घटाकर ठीक काम करना चाहिए।

यदि आप बड़ी संख्या में रूपांतरित करना चाहते हैं तो निम्न कार्य करेंगे:

char *string = "24";

int value;

int assigned = sscanf(string, "%d", &value);

** स्थिति की जांच करना न भूलें (जो उपरोक्त मामले में काम करने पर 1 होना चाहिए)।

पॉल।


0
char chVal = '5';
char chIndex;

if ((chVal >= '0') && (chVal <= '9')) {

    chIndex = chVal - '0';
}
else 
if ((chVal >= 'a') && (chVal <= 'z')) {

    chIndex = chVal - 'a';
}
else 
if ((chVal >= 'A') && (chVal <= 'Z')) {

    chIndex = chVal - 'A';
}
else {
    chIndex = -1; // Error value !!!
}

0

जब मुझे ऐसा कुछ करने की आवश्यकता होती है, तो मैं अपने इच्छित मूल्यों के साथ एक सरणी देता हूं।

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 लाइब्रेरी के कई कार्यान्वयनों द्वारा लिया गया दृष्टिकोण है। आप तुच्छ रूप से हेक्स अंकों के साथ भी काम करने के लिए इसे अनुकूलित कर सकते हैं।


यह एक दशमलव (या अष्टाधारी) अंक को परिवर्तित करने के लिए बेहद अक्षम लगता है। यदि आपके लुकअप टेबल का प्रासंगिक हिस्सा L1 कैश में नहीं होता है, तो आप इसे केवल एक मान प्राप्त करने के लिए इसे खींचने के लिए साइकिल का एक गुच्छा उड़ाएंगे। सच कहूं, तो मुझे संदेह है कि यह एक अच्छा विचार है यदि आप अंकों की एक पूरी आस्तीन में परिवर्तित कर रहे हैं, लेकिन आपको इसे मापना होगा। यह निश्चित रूप से हेक्स के लिए बहुत अधिक प्रतिस्पर्धी है।
dfeuer

0

इसे देखो,

char s='A';

int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);

केवल 0,1,2 के लिए, ...., ई, एफ।


0

बस atol()फ़ंक्शन का उपयोग करें :

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

int main() 
{
    const char *c = "5";
    int d = atol(c);
    printf("%d\n", d);

}

0

यदि आपका अंक है, तो कहें, '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)
पलकें

@eyllanesc पहले यह एक 4. धन्यवाद था। इसे संपादित किया।
Garmekain

0

यहाँ सहायक कार्य हैं जो अंक को चार में अंतर में बदलने की अनुमति देते हैं और इसके विपरीत:

int toInt(char c) {
    return c - '0';
}

char toChar(int i) {
    return i + '0';
}

-2

समारोह का उपयोग करें: सरणी के लिए पूर्णांक के लिए सरणी, फ्लोट प्रकार के लिए सरणी के लिए; या

char c = '5';
int b = c - 48;
printf("%d", b);

कई जवाबों ने पहले ही इसे कवर कर लिया। यह कुछ भी नहीं जोड़ता है जो उन्होंने पहले से ही कवर नहीं किया था।
शैडो रेंजर

-3

आप इसे एक इंट (या फ्लोट या डबल या कभी भी आप इसके साथ क्या करना चाहते हैं) को कास्ट करेंगे और इसे एन्टर चर में स्टोर करेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.