मैं C और C ++ में a char
को कैसे परिवर्तित करूं int
?
c
और c++
, मुझे लगता है कि दोनों भाषाओं का सामना करना उचित है।
char
वास्तव में इसका क्या मतलब है।
मैं C और C ++ में a char
को कैसे परिवर्तित करूं int
?
c
और c++
, मुझे लगता है कि दोनों भाषाओं का सामना करना उचित है।
char
वास्तव में इसका क्या मतलब है।
जवाबों:
निर्भर करता है कि आपकी क्या करने की इच्छा है:
मान को 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
सीधे पहले आता है , दोनों के बीच का अंतर उस संख्या को देता है जिसका चरित्र प्रतिनिधित्व करता है।1
9
a
&
-> -10) से पहले आस्की पात्रों के लिए एक नकारात्मक संख्या देता है, और यह आपको 10 से बड़े नंबर देता है (जैसे x
-> 26)
'1'
संख्या प्रदान करता है जो कि नहीं है 1
, तो आपको '0'
0-9 से गिनने के लिए ऑफसेट को हटाने के लिए इसे हटाने की आवश्यकता है । लगातार संख्या 1-9 आसिकी पूर्णांक संख्या से सटे हैं।
खैर, ASCII कोड में, संख्याएं (अंक) 48 से शुरू होती हैं । आपको बस इतना करना है:
int x = (int)character - 48;
'0'
C और C ++ हमेशा कम से कम प्रकार को बढ़ावा देते हैं int
। इसके अलावा वर्ण शाब्दिक int
C और char
C ++ में टाइप के हैं ।
आप char
केवल एक को असाइन करके एक प्रकार परिवर्तित कर सकते हैं int
।
char c = 'a'; // narrowing on C
int a = c;
operator+()
।
int a = c;
) कोई भी नकारात्मक मान रखेगा, जो C मानक लाइब्रेरी फ़ंक्शंस से निपट नहीं सकता है। C मानक लाइब्रेरी फ़ंक्शंस char
मानों को संभालने के लिए मानक का मानक निर्धारित करता है int
।
चार बस बाइट पूर्णांक है। जादू के साथ कुछ भी नहीं है! जैसे आप किसी इंट को शॉर्ट, या एक इंट को लंबे समय तक असाइन कर सकते हैं, वैसे ही आप एक इंट को एक चार को असाइन कर सकते हैं।
हां, आदिम डेटा प्रकार का नाम "चार" होता है, जो यह कहता है कि यह केवल वर्ण होना चाहिए। लेकिन वास्तव में, "चार" सिर्फ एक गरीब नाम है जो हर उस व्यक्ति को भ्रमित कर सकता है जो भाषा सीखने की कोशिश करता है। इसके लिए एक बेहतर नाम 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
।
char
हमेशा 1 बाइट होता है और यदि दिए गए सिस्टम पर टाइप int8_t
/ uint8_t
मौजूद हैं (जो बहुत संभावना है), तो वे एक के परिणाम को फिट करने में सक्षम होंगे char
, क्योंकि यह तब 8 बिट होगा। विभिन्न अप्रचलित प्रणालियों पर जैसे कि विभिन्न अप्रचलित डीएसपी, char
16 बिट्स होंगे और uint8_t
वसीयत मौजूद नहीं होगी। अप्रचलित डीएसपी के साथ संगतता के लिए कोड लिखना बकवास है, जैसा कि किसी के पूरक या संकेत और परिमाण प्रणालियों के साथ संगतता के लिए लिख रहा है। समय की भारी बर्बादी, क्योंकि इस तरह की प्रणालियाँ वास्तविक दुनिया में मुश्किल से मौजूद हैं।
(यह उत्तर चीजों के सी ++ पक्ष को संबोधित करता है, लेकिन साइन एक्सटेंशन समस्या सी में भी मौजूद है।)
सभी तीन 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
, लेकिन वे पूरी तरह से कलाकारों को लपेटते हैं , के लिए त्रुटि जाँच जोड़ने के लिए एक सुविधाजनक स्थान प्रदान करते हैं- और, जब आप उन्हें कई बार उपयोग करने की आवश्यकता होती है तो कम और अधिक स्पष्ट होंगे। निकट सानिध्य में।
उपयोग करें static_cast<int>
:
int num = static_cast<int>(letter); // if letter='a', num=97
संपादित करें: आपको संभवतः उपयोग करने से बचने का प्रयास करना चाहिए(int)
int संख्या = (int) पत्र;
देखें कि क्यों (int) x के बजाय static_cast <int> (x) का उपयोग करें? अधिक जानकारी के लिए।
यह इस पर निर्भर करता है कि आप "कन्वर्ट" से क्या मतलब है।
यदि आपके पास वर्णों की एक श्रृंखला है जो "123456" की तरह पूर्णांक का प्रतिनिधित्व करती है, तो ऐसा करने के दो विशिष्ट तरीके हैं: C में एक विशेष-प्रयोजन रूपांतरण का उपयोग करें जैसे कि atoi () या strtol () , या सामान्य-उद्देश्य sscanf () । C ++ (जो अपग्रेड के रूप में वास्तव में एक अलग भाषा है) एक तीसरा, स्ट्रिंगस्ट्रीम जोड़ता है।
अगर आपको लगता है कि आप चाहते हैं कि आपके किसी एक int
चर में सटीक बिट पैटर्न को एक के रूप में माना जाए char
, तो यह आसान है। सी में अलग पूर्णांक प्रकार वास्तव में वास्तविक "अलग" प्रकार की तुलना में मन की स्थिति के अधिक होते हैं। बस इसका उपयोग शुरू करें जहां char
एस के लिए कहा जाता है, और आपको ठीक होना चाहिए। संकलक को मौके पर छोड़ देने के लिए आपको एक स्पष्ट रूपांतरण की आवश्यकता हो सकती है, लेकिन यह सब करना चाहिए कि किसी भी अतिरिक्त बिट्स को पिछले 256 छोड़ दें।
मेरे पास 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;
}
संभवत: आप इस रूपांतरण को C मानक लाइब्रेरी के कार्यों का उपयोग करना चाहते हैं।
उस स्थिति में, (C ++ सिंटैक्स) करें
typedef unsigned char UChar;
char myCppFunc( char c )
{
return char( someCFunc( UChar( c ) ) );
}
अभिव्यक्ति को UChar( c )
रूपांतरित करता हैunsigned char
नकारात्मक मूल्यों से छुटकारा पाने के लिए है, जो ईओएफ को छोड़कर, सी फ़ंक्शन द्वारा समर्थित नहीं हैं।
फिर उस अभिव्यक्ति के परिणाम को int
औपचारिक तर्क के लिए वास्तविक तर्क के रूप में उपयोग किया जाता है। जहां आपको ऑटोमैटिक प्रमोशन मिलता है int
। आप वैकल्पिक रूप से उस अंतिम चरण को स्पष्ट रूप से लिख सकते हैं, जैसेint( UChar( c ) )
, लेकिन व्यक्तिगत रूप से मुझे वह क्रिया भी लगती है।
चीयर्स एंड हर्थ।
मैं एक चार सरणी की तरह परिवर्तित करने में समस्या हो रही थी "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;
}
आशा है ये मदद करेगा!
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/ का संदर्भ ले सकते हैं ।