আমি কিভাবে একটি রূপান্তর না char
একটি থেকে int
এ সি এবং সি ++?
c
এবং c++
, আমি মনে করি উভয় ভাষার মুখোমুখি উত্তরগুলি যুক্তিসঙ্গত।
char
।
আমি কিভাবে একটি রূপান্তর না 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')
, যার অর্থ অক্ষরের ascii মান একে অপরের থেকে বিয়োগ করা হয়। যেহেতু আসকি টেবিলে 0
সরাসরি আসার আগে 1
(এবং অবধি অবধি 9
), দুটির মধ্যে পার্থক্যটি চরিত্রটি a
উপস্থাপন করে এমন সংখ্যা দেয় ।
&
-> -10) এর আগে আসকি চরিত্রের জন্য একটি নেতিবাচক সংখ্যা দেয় এবং এটি আপনাকে 10 (যেমন x
-> 26) এর চেয়ে বড় সংখ্যা দেয়
'1'
এমন একটি এসকি নম্বর সরবরাহ করে যা এটি নয় 1
, আপনাকে '0'
0-9 থেকে গণনা করার জন্য অফসেটটি সরিয়ে ফেলতে হবে। পরের সংখ্যা 1-9 ascii পূর্ণসংখ্যার সংলগ্ন হয়।
ঠিক আছে, ASCII কোডে, সংখ্যাগুলি (সংখ্যাগুলি) 48 থেকে শুরু হয় । আপনাকে যা করতে হবে তা হ'ল:
int x = (int)character - 48;
'0'
সি এবং সি ++ সর্বদা কমপক্ষে প্রকারগুলি প্রচার করে int
। আরও অক্ষর অক্ষর int
সি এবং char
সি ++ টাইপ করা হয় ।
আপনি char
কেবল একটি নির্দিষ্ট করে একটি ধরণ রূপান্তর করতে পারেন int
।
char c = 'a'; // narrowing on C
int a = c;
operator+()
।
int a = c;
) এমন কোনও নেতিবাচক মান রাখবে, যা সি স্ট্যান্ডার্ড লাইব্রেরি ফাংশনগুলি মোকাবেলা করতে পারে না। সি স্ট্যান্ডার্ড লাইব্রেরি ফাংশন char
মানগুলি হ্যান্ডেল করার অর্থ কী তার জন্য এটি স্ট্যান্ডার্ড সেট করে int
।
চরটি একটি 1 বাইট পূর্ণসংখ্যা। চরের টাইপের সাথে ম্যাজিক কিছুই নেই! যেমন আপনি কোনও সংক্ষিপ্তসারকে একটি সংক্ষিপ্তসার বা একটি দীর্ঘকে একটি অন্তর নির্ধারণ করতে পারেন, আপনি কোনও ইনটকে একটি চর নির্ধারণ করতে পারেন।
হ্যাঁ, আদিম ডেটা টাইপের নামটি "চর" হিসাবে ঘটে যা এটি কেবল অক্ষরগুলি ধারণ করে ins তবে বাস্তবে, "চর" হ'ল ভাষা শিখার চেষ্টা করে এমন সকলকে বিভ্রান্ত করার জন্য একটি দুর্বল নাম চয়েস। এর জন্য আরও ভাল নামটি int8_t এবং আপনার সংকলক সর্বশেষ সি স্ট্যান্ডার্ড অনুসরণ করে যদি আপনি তার পরিবর্তে সেই নামটি ব্যবহার করতে পারেন।
যদিও স্ট্রিং হ্যান্ডলিং করার সময় আপনার চর টাইপটি ব্যবহার করা উচিত , কারণ ক্লাসিক ASCII টেবিলের সূচকটি 1 বাইটে ফিট করে। আপনি তবে নিয়মিত ইনটগুলির সাথে স্ট্রিং হ্যান্ডলিংও করতে পারেন, যদিও আপনি কেন এটি করতে চান তা বাস্তব বিশ্বে কোনও ব্যবহারিক কারণ নেই। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি নিখুঁতভাবে কাজ করবে:
int str[] = {'h', 'e', 'l', 'l', 'o', '\0' };
for(i=0; i<6; i++)
{
printf("%c", str[i]);
}
আপনাকে বুঝতে হবে যে কম্পিউটারে থাকা সমস্ত কিছুর মতো অক্ষর এবং স্ট্রিংগুলি কেবল সংখ্যা। আপনি যখন সোর্স কোডটিতে 'এ' লিখবেন, তখন এটি 97 নম্বরে প্রাক-প্রক্রিয়াজাত হয় যা একটি পূর্ণসংখ্যার ধ্রুবক।
সুতরাং আপনি যদি একটি মত লিখুন
char ch = '5';
ch = ch - '0';
এটি আসলে সমতুল্য
char ch = (int)53;
ch = ch - (int)48;
যা সি ভাষার পূর্ণসংখ্যার প্রচারের মধ্য দিয়ে চলছে
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.
মনে রাখবেন যে int এর মাধ্যমে রূপান্তর অন্তর্ভুক্ত; এটির একই ইউবি রয়েছে:
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)
সর্বদা আপনাকে একটি অ-নেতিবাচক মান দেয় - এমনকি aণাত্মক char
বা নেতিবাচক পাস করার পরেও signed char
- এবং যে chr
কোনও মান ord
উত্পাদন করে এবং ঠিক একইটি দেয় char
।
অনুশীলনে, আমি সম্ভবত এটি unsigned char
ব্যবহারের পরিবর্তে কেবল কাস্ট করব , তবে তারা দৃ the়ভাবে কাস্টটিকে আবৃত করে রাখে, int
-থেকে- এর জন্য ত্রুটি পরীক্ষা করার জন্য একটি সুবিধাজনক জায়গা সরবরাহ করে char
এবং আপনাকে যখন বেশ কয়েকবার ব্যবহার করার প্রয়োজন হয় তখন সংক্ষিপ্ত এবং আরও স্পষ্ট হবে them কাছাকাছি.
ব্যবহার static_cast<int>
:
int num = static_cast<int>(letter); // if letter='a', num=97
সম্পাদনা: আপনার সম্ভবত ব্যবহার এড়াতে চেষ্টা করা উচিত(int)
int num = (int) চিঠি;
চেক আউট কেন (ইনট) এক্স এর পরিবর্তে স্ট্যাটিক_কাস্ট <int> (এক্স) ব্যবহার করবেন? আরও তথ্যের জন্য.
এটি ধরণের "রূপান্তর" দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে।
ব্যবহারের মত একটি বিশেষ উদ্দেশ্য রূপান্তর: আপনি যে একটি পূর্ণসংখ্যা প্রতিনিধিত্ব করে, "123456" মত অক্ষরের একটি সিরিজ আছে, তাহলে সেখানে কি যে সি দুটি টিপিক্যাল উপায় আছে আপনি atoi () বা strtol () , অথবা সাধারণ যদি sscanf () । সি ++ (যা আপগ্রেড হিসাবে সত্যই আলাদা ভাষার মুখোশযুক্ত) একটি তৃতীয়, স্ট্রিংস্ট্রিম যুক্ত করে।
যদি আপনি বোঝাতে চান যে আপনি চান যে কোনও একটি 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;
}
সম্ভবত আপনি সি স্ট্যান্ডার্ড লাইব্রেরি থেকে ফাংশন ব্যবহার করার জন্য এই রূপান্তরটি চান।
সেক্ষেত্রে (সি ++ সিনট্যাক্স) করুন
typedef unsigned char UChar;
char myCppFunc( char c )
{
return char( someCFunc( UChar( c ) ) );
}
নেতিবাচক মানগুলি থেকে মুক্তি পাওয়ার জন্য অভিব্যক্তি UChar( c )
রূপান্তরিত হয় unsigned char
, যা, ইওএফ ব্যতীত সি ফাংশন দ্বারা সমর্থিত নয়।
তারপরে সেই অভিব্যক্তির ফলাফলটি একটি int
আনুষ্ঠানিক যুক্তির আসল যুক্তি হিসাবে ব্যবহৃত হয় । যেখানে আপনি স্বয়ংক্রিয়ভাবে প্রচার পাবেন int
। আপনি বিকল্পভাবে শেষ ধাপটি স্পষ্টভাবে লিখতে পারেন, পছন্দ করতে পারেন int( UChar( c ) )
, তবে ব্যক্তিগতভাবে আমি এটি খুব ভার্জোজ মনে করি।
চিয়ার্স এবং এইচটিএইচ,
চার্ট অ্যারেটিকে "7c7c7d7d7d7d7c7c7c7d7d7d7d7c7c7c7c7c7c7d7d7c7c7c7c7d7c7d7d7d7c7c2e2e2e"
প্রকৃত পূর্ণসংখ্যার মান হিসাবে রূপান্তর করতে আমার সমস্যা হয়েছিল যা he 7C 'দ্বারা একটি হেক্সাডেসিমাল মান হিসাবে উপস্থাপন করতে সক্ষম হবে। সুতরাং, সাহায্যের জন্য ক্রুজ করার পরে আমি এটি তৈরি করেছি এবং ভেবেছিলাম ভাগ করে নেওয়া ভাল।
এটি চরের স্ট্রিংটিকে তার ডান সংখ্যায় পৃথক করে এবং কেবল আমার চেয়ে বেশি লোকের পক্ষে সহায়ক হতে পারে;)
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/references/cstdlib/atoi/ , http://www.cplusplus.com/references/string/stoi/ দেখুন ।