C और C ++ में int को char में बदलें


400

मैं C और C ++ में a charको कैसे परिवर्तित करूं int?


1
@ मैट: अधिक ठोस होना एक अच्छा विचार होगा। एक सामान्यीकरण के बारे में पूछना बस सामान्यीकृत उत्तरों को आमंत्रित करता है जो लागू नहीं होते हैं या आपके कार्य के लिए सही नहीं होते हैं । ध्यान रखें, जब आपको पूछना हो, तो आप सही ढंग से सामान्यीकरण करने के लिए पर्याप्त नहीं जानते हैं।
चीयर्स एंड हीथ। - अल्फ

@ एल्फ पी। स्टाइनबैक: मूल प्रश्न किस भाषा को लेकर अस्पष्ट था। कीवर्ड के साथ cऔर c++, मुझे लगता है कि दोनों भाषाओं का सामना करना उचित है।
मैट जॉइनर

8
अन्य तकनीकी मंचों पर मेरे व्यापक अनुभव से, मेरा अंतर्ज्ञान यह है कि ओपी का वास्तव में अर्थ है "मैं किसी संख्या का आधारभूत पाठ निरूपण कैसे करूं (आधार 10 में) और इसे संबंधित संख्या में परिवर्तित करूं?" आम तौर पर बोल, C और C ++ neophytes में आमतौर पर अविश्वसनीय रूप से फ़र्ज़ी विचार होते हैं कि उन भाषाओं में पाठ कैसे काम करता है और charवास्तव में इसका क्या मतलब है।
कार्ल किंचल

3
@KarlKnechtel: यदि यह सच है (मैं इसे लगभग 50/50 देता हूं क्योंकि बहुत सारे शुरुआती ट्यूटोरियल भी ASCII मूल्यों को वर्णों से बाहर निकलने के लिए प्रोत्साहित करते हैं, भले ही ASCII पूरी सीमा को कवर नहीं करता है), ओपी को स्पष्टता की आवश्यकता है - कि यह एक डुबकी है of stackoverflow.com/questions/439573/…
फ्रेड नर्क

3
इस प्रश्न को स्पष्ट करने के लिए ओपी के पास तीन घंटे थे और ऐसा करने में विफल रहे। वैसे भी, यह जानने का कोई तरीका नहीं है कि वास्तव में क्या पूछा गया है। बंद करने के लिए वोट दिया गया।
sbi

जवाबों:


551

निर्भर करता है कि आपकी क्या करने की इच्छा है:

मान को ascii कोड के रूप में पढ़ने के लिए, आप लिख सकते हैं

char a = 'a';
int ia = (int)a; 
/* note that the int cast is not necessary -- int ia = a would suffice */

चरित्र परिवर्तित करने के लिए '0' -> 0, '1' -> 1, आदि, आप लिख सकते हैं

char a = '4';
int ia = a - '0';
/* check here if ia is bounded by 0 and 9 */

व्याख्या :
a - '0'के समतुल्य है ((int)a) - ((int)'0'), जिसका अर्थ है कि वर्णों के अस्की मूल्यों को एक दूसरे से घटाया जाता है। चूँकि आस्की तालिका में (और तब तक ) 0सीधे पहले आता है , दोनों के बीच का अंतर उस संख्या को देता है जिसका चरित्र प्रतिनिधित्व करता है।19a



@KshitijBanerjee यह दो कारणों से एक अच्छा विचार नहीं है: यह आपको '0' (जैसे &-> -10) से पहले आस्की पात्रों के लिए एक नकारात्मक संख्या देता है, और यह आपको 10 से बड़े नंबर देता है (जैसे x-> 26)
शीटजेएस

2
int ia = a - '0' - कि आपको क्या चाहिए
फंक

5
@ kevin001 यदि आप चार को इंट में बदलना चाहते हैं और एक चरित्र एक एेसी '1'संख्या प्रदान करता है जो कि नहीं है 1, तो आपको '0'0-9 से गिनने के लिए ऑफसेट को हटाने के लिए इसे हटाने की आवश्यकता है । लगातार संख्या 1-9 आसिकी पूर्णांक संख्या से सटे हैं।
कृष्णद्वारा निर्देशांक

कोई कास्ट की आवश्यकता नहीं है / वांछित
क्रेग एस्टे

97

खैर, ASCII कोड में, संख्याएं (अंक) 48 से शुरू होती हैं । आपको बस इतना करना है:

int x = (int)character - 48;

19
@chad: न केवल अधिक पठनीय, यह अधिक पोर्टेबल भी है। C और C ++ ASCII प्रतिनिधित्व की गारंटी नहीं देते हैं, लेकिन वे गारंटी देते हैं कि जो भी प्रतिनिधित्व उपयोग में है, 10 दशमलव अंकों का प्रतिनिधित्व सन्निहित और संख्यात्मक क्रम में है।
बेन वोइग्ट

केवल एक चीज जिसे मैंने बदल दिया है, वह है 48 को मुड़ना, जो थोड़ा "जादुई" लगता है'0'
एरियलग्रो

59

C और C ++ हमेशा कम से कम प्रकार को बढ़ावा देते हैं int। इसके अलावा वर्ण शाब्दिक intC और charC ++ में टाइप के हैं ।

आप charकेवल एक को असाइन करके एक प्रकार परिवर्तित कर सकते हैं int

char c = 'a'; // narrowing on C
int a = c;

3
आप इस उद्देश्य के लिए व्यर्थ की सराहना की जा सकने वाली एकसूत्र का भी उपयोग कर सकते हैं operator+()
क्यूबाई

24
-1 प्रश्न की एकमात्र सार्थक व्याख्या के लिए उत्तर गलत है। यह (कोड int a = c;) कोई भी नकारात्मक मान रखेगा, जो C मानक लाइब्रेरी फ़ंक्शंस से निपट नहीं सकता है। C मानक लाइब्रेरी फ़ंक्शंस charमानों को संभालने के लिए मानक का मानक निर्धारित करता है int
चीयर्स एंड हीथ। - अल्फ

6
@Matt: मैं नीचे रख रहा हूँ। यदि संभव हो तो मैं इसे मजबूत करूँगा! आपके और अन्य लोगों ने जो प्रश्न व्याख्या की है, वह सार्थक नहीं है, क्योंकि यह बहुत ही तुच्छ है, और क्योंकि ओपी के विशेष प्रकार के संयोजन के लिए एक गैर-तुच्छ बहुत महत्वपूर्ण व्यावहारिक मुद्दा नहीं है। आपके द्वारा दी गई सलाह सीधे नौसिखिए के लिए खतरनाक है। यह उनके कार्यक्रमों के लिए अपरिभाषित व्यवहार का सबसे अधिक संभावना होगा जो सी मानक पुस्तकालय चरित्र वर्गीकरण कार्यों का उपयोग करते हैं। फिर से रेफरी। @ सियाम के जवाब के लिए, उन्होंने उस जवाब को हटा दिया है।
चीयर्स एंड हीथ। - अल्फ

3
-1 गलत होने के लिए: 1252 हाईबिट कैरेक्टर पास होने पर isupper () के पास अपरिभाषित परिणाम होंगे।
बजे क्रिस बेक

1
"हमेशा बढ़ावा" से आपका क्या अभिप्राय है? निहितार्थ रूपांतरण के दौरान मानों को बढ़ावा दिया जाता है, कुछ प्रकार के पैरामीटर गुजरते हैं (जैसे, एक varargs फ़ंक्शन के लिए), और जब एक ऑपरेटर को अपने ऑपरेंड को संगत प्रकार बनाना चाहिए। लेकिन निश्चित रूप से ऐसे समय होते हैं जब किसी मूल्य को बढ़ावा नहीं दिया जाता है (जैसे कि अगर मैं किसी फंक्शन की उम्मीद के लिए चार पास करता हूं), अन्यथा हमारे पास किसी भी प्रकार के इंट से छोटे नहीं होंगे।
एड्रियन मेकार्थी

31

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

हां, आदिम डेटा प्रकार का नाम "चार" होता है, जो यह कहता है कि यह केवल वर्ण होना चाहिए। लेकिन वास्तव में, "चार" सिर्फ एक गरीब नाम है जो हर उस व्यक्ति को भ्रमित कर सकता है जो भाषा सीखने की कोशिश करता है। इसके लिए एक बेहतर नाम int8_t है, और आप उस नाम का उपयोग कर सकते हैं, यदि आपका कंपाइलर नवीनतम C मानक का अनुसरण करता है।

हालांकि बेशक आपको स्ट्रिंग हैंडलिंग करते समय चार प्रकार का उपयोग करना चाहिए , क्योंकि क्लासिक एएससीआईआई तालिका का सूचकांक 1 बाइट में फिट बैठता है। आप नियमित स्ट्रिंग के साथ-साथ स्ट्रिंग हैंडलिंग भी कर सकते हैं , हालांकि वास्तविक दुनिया में कोई व्यावहारिक कारण नहीं है कि आप ऐसा क्यों करना चाहते हैं। उदाहरण के लिए, निम्न कोड पूरी तरह से काम करेगा:

  int str[] = {'h', 'e', 'l', 'l', 'o', '\0' };

  for(i=0; i<6; i++)
  {
    printf("%c", str[i]);
  }

आपको यह महसूस करना होगा कि अक्षर और तार सिर्फ संख्याएँ हैं, जैसे कंप्यूटर में सब कुछ। जब आप स्रोत कोड में 'a' लिखते हैं, तो यह संख्या 97 में पूर्व-संसाधित होती है, जो पूर्णांक स्थिरांक है।

तो अगर आप एक अभिव्यक्ति की तरह लिखते हैं

char ch = '5';
ch = ch - '0';

यह वास्तव में इसके बराबर है

char ch = (int)53;
ch = ch - (int)48;

जो तब C भाषा पूर्णांक प्रचार के माध्यम से जा रहा है

ch = (int)ch - (int)48;

और फिर परिणाम प्रकार को फिट करने के लिए एक चार को काट दिया

ch = (char)( (int)ch - (int)48 );

इस तरह की बहुत सी सूक्ष्म चीजें हैं जो लाइनों के बीच चल रही हैं, जहां चार को एक इंट के रूप में माना जाता है।


चूंकि प्रश्न के साथ टैग नहीं किया गया है ascii, इसलिए आपको किसी विशिष्ट एन्कोडिंग का अनुमान नहीं लगाना चाहिए। charबराबर स्थापित करना int8_tगलत है क्योंकि यह समान रूप से uint8_tया हो सकता है uint24_t
रोलैंड इलिग

1
@ रोलैंडलीग नं, एक charहमेशा 1 बाइट होता है और यदि दिए गए सिस्टम पर टाइप int8_t/ uint8_tमौजूद हैं (जो बहुत संभावना है), तो वे एक के परिणाम को फिट करने में सक्षम होंगे char, क्योंकि यह तब 8 बिट होगा। विभिन्न अप्रचलित प्रणालियों पर जैसे कि विभिन्न अप्रचलित डीएसपी, char16 बिट्स होंगे और uint8_tवसीयत मौजूद नहीं होगी। अप्रचलित डीएसपी के साथ संगतता के लिए कोड लिखना बकवास है, जैसा कि किसी के पूरक या संकेत और परिमाण प्रणालियों के साथ संगतता के लिए लिख रहा है। समय की भारी बर्बादी, क्योंकि इस तरह की प्रणालियाँ वास्तविक दुनिया में मुश्किल से मौजूद हैं।
लंडिन

18

(यह उत्तर चीजों के सी ++ पक्ष को संबोधित करता है, लेकिन साइन एक्सटेंशन समस्या सी में भी मौजूद है।)

सभी तीन charप्रकारों ( signed, unsignedऔर, char) को संभालने से यह पहले दिखाई देने से अधिक नाजुक है। सीमा में मान 0 से SCHAR_MAX(जो 8-बिट के लिए 127 है char) आसान हैं:

char c = somevalue;
signed char sc = c;
unsigned char uc = c;
int n = c;

लेकिन, जब somevalueवह सीमा के बाहर होता है, तो केवल unsigned charआपको charतीनों प्रकारों में "समान" मूल्यों के लिए लगातार परिणाम देता है :

char c = somevalue;
signed char sc = c;
unsigned char uc = c;
// Might not be true: int(c) == int(sc) and int(c) == int(uc).
int nc = (unsigned char)c;
int nsc = (unsigned char)sc;
int nuc = (unsigned char)uc;
// Always true: nc == nsc and nc == nuc.

Ctype.h से फ़ंक्शन का उपयोग करते समय यह महत्वपूर्ण है , जैसे कि , isupperया toupperसाइन एक्सटेंशन के कारण:

char c = negative_char;  // Assuming CHAR_MIN < 0.
int n = c;
bool b = isupper(n);  // Undefined behavior.

ध्यान दें कि इंट के माध्यम से रूपांतरण निहित है; यह एक ही यूबी है:

char c = negative_char;
bool b = isupper(c);

इसे ठीक करने के लिए unsigned char, ctype.h फ़ंक्शन को safe_ctype के माध्यम से लपेटकर आसानी से किया जा सकता है :

template<int (&F)(int)>
int safe_ctype(unsigned char c) { return F(c); }

//...
char c = CHAR_MIN;
bool b = safe_ctype<isupper>(c);  // No UB.

std::string s = "value that may contain negative chars; e.g. user input";
std::transform(s.begin(), s.end(), s.begin(), &safe_ctype<toupper>);
// Must wrap toupper to eliminate UB in this case, you can't cast
// to unsigned char because the function is called inside transform.

यह काम करता है क्योंकि तीन चार प्रकारों में से किसी भी फ़ंक्शन को लेने से अन्य दो चार प्रकार भी हो सकते हैं। यह दो कार्यों की ओर जाता है जो किसी भी प्रकार को संभाल सकता है:

int ord(char c) { return (unsigned char)c; }
char chr(int n) {
  assert(0 <= n);  // Or other error-/sanity-checking.
  assert(n <= UCHAR_MAX);
  return (unsigned char)n;
}

// Ord and chr are named to match similar functions in other languages
// and libraries.

ord(c)हमेशा आपको एक गैर-नकारात्मक मूल्य देता है - यहां तक ​​कि जब एक नकारात्मक charया नकारात्मक पारित किया जाता है signed char- और chrकोई भी मूल्य ordपैदा करता है और ठीक उसी को वापस देता है char

व्यवहार में, मैं शायद unsigned charइन का उपयोग करने के बजाय केवल डाली intजाऊंगा char, लेकिन वे पूरी तरह से कलाकारों को लपेटते हैं , के लिए त्रुटि जाँच जोड़ने के लिए एक सुविधाजनक स्थान प्रदान करते हैं- और, जब आप उन्हें कई बार उपयोग करने की आवश्यकता होती है तो कम और अधिक स्पष्ट होंगे। निकट सानिध्य में।


12

उपयोग करें static_cast<int>:

int num = static_cast<int>(letter); // if letter='a', num=97

संपादित करें: आपको संभवतः उपयोग करने से बचने का प्रयास करना चाहिए(int)

int संख्या = (int) पत्र;

देखें कि क्यों (int) x के बजाय static_cast <int> (x) का उपयोग करें? अधिक जानकारी के लिए।


7

यह इस पर निर्भर करता है कि आप "कन्वर्ट" से क्या मतलब है।

यदि आपके पास वर्णों की एक श्रृंखला है जो "123456" की तरह पूर्णांक का प्रतिनिधित्व करती है, तो ऐसा करने के दो विशिष्ट तरीके हैं: C में एक विशेष-प्रयोजन रूपांतरण का उपयोग करें जैसे कि atoi () या strtol () , या सामान्य-उद्देश्य sscanf () । C ++ (जो अपग्रेड के रूप में वास्तव में एक अलग भाषा है) एक तीसरा, स्ट्रिंगस्ट्रीम जोड़ता है।

अगर आपको लगता है कि आप चाहते हैं कि आपके किसी एक intचर में सटीक बिट पैटर्न को एक के रूप में माना जाए char, तो यह आसान है। सी में अलग पूर्णांक प्रकार वास्तव में वास्तविक "अलग" प्रकार की तुलना में मन की स्थिति के अधिक होते हैं। बस इसका उपयोग शुरू करें जहां charएस के लिए कहा जाता है, और आपको ठीक होना चाहिए। संकलक को मौके पर छोड़ देने के लिए आपको एक स्पष्ट रूपांतरण की आवश्यकता हो सकती है, लेकिन यह सब करना चाहिए कि किसी भी अतिरिक्त बिट्स को पिछले 256 छोड़ दें।


6

मेरे पास nullसी में बिल्कुल कौशल है, लेकिन एक साधारण पार्सिंग के लिए:

char* something = "123456";

int number = parseInt(something);

... यह मेरे लिए काम किया:

int parseInt(char* chars)
{
    int sum = 0;
    int len = strlen(chars);
    for (int x = 0; x < len; x++)
    {
        int n = chars[len - (x + 1)] - '0';
        sum = sum + powInt(n, x);
    }
    return sum;
}

int powInt(int x, int y)
{
    for (int i = 0; i < y; i++)
    {
        x *= 10;
    }
    return x;
}

यह कोड जल्दी से अपरिभाषित व्यवहार को आमंत्रित करता है और इसलिए प्रतिलिपि और चिपकाने के लिए उपयुक्त नहीं है। (int overflow)
रोलैंड इलिग

4

संभवत: आप इस रूपांतरण को C मानक लाइब्रेरी के कार्यों का उपयोग करना चाहते हैं।

उस स्थिति में, (C ++ सिंटैक्स) करें

typedef unsigned char UChar;

char myCppFunc( char c )
{
    return char( someCFunc( UChar( c ) ) );
}

अभिव्यक्ति को UChar( c )रूपांतरित करता हैunsigned char नकारात्मक मूल्यों से छुटकारा पाने के लिए है, जो ईओएफ को छोड़कर, सी फ़ंक्शन द्वारा समर्थित नहीं हैं।

फिर उस अभिव्यक्ति के परिणाम को intऔपचारिक तर्क के लिए वास्तविक तर्क के रूप में उपयोग किया जाता है। जहां आपको ऑटोमैटिक प्रमोशन मिलता है int। आप वैकल्पिक रूप से उस अंतिम चरण को स्पष्ट रूप से लिख सकते हैं, जैसेint( UChar( c ) ) , लेकिन व्यक्तिगत रूप से मुझे वह क्रिया भी लगती है।

चीयर्स एंड हर्थ।


0

मैं एक चार सरणी की तरह परिवर्तित करने में समस्या हो रही थी "7c7c7d7d7d7d7c7c7c7d7d7d7d7c7c7c7c7c7c7d7d7c7c7c7c7d7c7d7d7d7c7c2e2e2e" अपने वास्तविक पूर्णांक मान की एक हेक्साडेसिमल मान के रूप में `7 सी 'द्वारा दर्शाया जा सकेगा। इसलिए, मदद के लिए मंडराने के बाद मैंने इसे बनाया, और सोचा कि इसे साझा करना अच्छा होगा।

यह चार स्ट्रिंग को उसके दाहिने पूर्णांक में अलग करता है, और मेरे से अधिक लोगों के लिए सहायक हो सकता है;)

unsigned int* char2int(char *a, int len)
{
    int i,u;
    unsigned int *val = malloc(len*sizeof(unsigned long));

    for(i=0,u=0;i<len;i++){
        if(i%2==0){
            if(a[i] <= 57)
                val[u] = (a[i]-50)<<4;
            else
                val[u] = (a[i]-55)<<4;
        }
        else{
            if(a[i] <= 57)
                val[u] += (a[i]-50);
            else
                val[u] += (a[i]-55);
            u++;
        }
    }
    return val;
}

आशा है ये मदद करेगा!


क्या आपने कभी इस कोड का परीक्षण किया है? 50 एक 48 होना चाहिए, 55 केवल अपरकेस ASCII अक्षरों के लिए काम करता है जबकि आपके उदाहरण में लोअरकेस अक्षर होते हैं।
रोलैंड इलिग

0

Int के लिए char या short के लिए, आपको बस मान असाइन करने की आवश्यकता है।

char ch = 16;
int in = ch;

वही int64 के लिए।

long long lo = ch;

सभी मान 16 होंगे।


-1
int charToint(char a){
char *p = &a;
int k = atoi(p);
return k;
}

आप इस एटॉय विधि का उपयोग चार को इंट में परिवर्तित करने के लिए कर सकते हैं। अधिक जानकारी के लिए, आप इस http://www.cplusplus.com/reference/cstdlib/atoi/ , http://www.cplusplus.com/reference/string/stoi/ का संदर्भ ले सकते हैं ।


1
यह अपरिभाषित व्यवहार है। एक चर चर का पता लेने से आपको एक चार * नहीं बल्कि एक सी-स्ट्रिंग मिलेगी, जो कि अटोई की उम्मीद है।
लुइज़फ्लक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.