সি এবং সি ++ তে চারে রূপান্তর করুন


400

আমি কিভাবে একটি রূপান্তর না charএকটি থেকে intএ সি এবং সি ++?


1
@ ম্যাট: আরও কংক্রিট হওয়া ভাল ধারণা হবে। একটি সাধারণীকরণ সম্পর্কে জিজ্ঞাসা করা কেবলমাত্র এমন জেনারেলাইজড উত্তরগুলিকে আমন্ত্রণ জানায় যা আপনার কাজের জন্য প্রযোজ্য বা এমনকি সঠিক নয় । মনে রাখতে হবে, যখন আপনাকে জিজ্ঞাসা করতে হবে, আপনি সম্ভবত সঠিকভাবে সাধারণকরণের জন্য যথেষ্ট জানেন না।
চিয়ার্স এবং এইচটিএইচ - Alf

@ অ্যালফ পি। স্টেইনবাচ: কোন ভাষা সম্পর্কে মূল প্রশ্নটি অস্পষ্ট ছিল। কীওয়ার্ড সহ cএবং c++, আমি মনে করি উভয় ভাষার মুখোমুখি উত্তরগুলি যুক্তিসঙ্গত।
ম্যাট জেন্ডার

8
অন্যান্য প্রযুক্তিগত ফোরামে আমার বিস্তৃত অভিজ্ঞতা থেকে, আমার অন্তর্নিহিততাটি হ'ল ওপি'র সত্যিকার অর্থে "কীভাবে আমি একটি সংখ্যার পাঠ্য উপস্থাপনা নেব (বেস 10 তে) এবং এটি সংখ্যায় রূপান্তর করব?" সাধারণভাবে বলতে গেলে, সি এবং সি ++ নিওফাইটগুলির মধ্যে সাধারণত এই ভাষাগুলিতে পাঠ্য কীভাবে কাজ করে এবং আসলে কী বোঝায় সে সম্পর্কে অবিশ্বাস্যরকম অস্পষ্ট ধারণা রয়েছে char
কার্ল নচেটেল

3
@ কার্লকেনিটেল: যদি এটি সত্য হয় (আমি এটি প্রায় 50/50 দিয়ে থাকি কারণ প্রচুর প্রাথমিক টিউটোরিয়ালগুলিও ASCII এর মানগুলি চরিত্রের বাইরে পাওয়ার জন্য উত্সাহ দেয়, যদিও ASCII পুরো পরিসরটি আবরণ করে না), তবে ওপিকে স্পষ্টতা দেওয়া দরকার - তবে এটি একটি দ্বিগুণ স্ট্যাকওভারফ্লো / প্রশ্ন / 439573/…
ফ্রেড নুরক

3
ওপির কাছে এই প্রশ্নটি পরিষ্কার করতে তিন ঘন্টা সময় ছিল এবং তা করতে ব্যর্থ হয়েছিল। যেমনটি হ'ল, আসলে কী জিজ্ঞাসা করা হয়েছে তা জানার কোনও উপায় নেই। ভোট বন্ধ।
এসবিআই

উত্তর:


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'), যার অর্থ অক্ষরের ascii মান একে অপরের থেকে বিয়োগ করা হয়। যেহেতু আসকি টেবিলে 0সরাসরি আসার আগে 1(এবং অবধি অবধি 9), দুটির মধ্যে পার্থক্যটি চরিত্রটি aউপস্থাপন করে এমন সংখ্যা দেয় ।



@ ক্ষিতিজবাণার্জি এটি দুটি কারণে ভাল ধারণা নয়: এটি আপনাকে '0' (যেমন &-> -10) এর আগে আসকি চরিত্রের জন্য একটি নেতিবাচক সংখ্যা দেয় এবং এটি আপনাকে 10 (যেমন x-> 26) এর চেয়ে বড় সংখ্যা দেয়
শীটজেএস

2
int- এ IA = একটি - '0' - যে আপনার যা প্রয়োজন
এড়ানো

5
@ কেভিন001 আপনি যদি চরটি ইনটকে রূপান্তর করতে চান এবং একটি চরিত্র '1'এমন একটি এসকি নম্বর সরবরাহ করে যা এটি নয় 1, আপনাকে '0'0-9 থেকে গণনা করার জন্য অফসেটটি সরিয়ে ফেলতে হবে। পরের সংখ্যা 1-9 ascii পূর্ণসংখ্যার সংলগ্ন হয়।
ক্রিসডেস্ট্রাকশন

কোনও নিক্ষেপ প্রয়োজন / পছন্দসই নয়
ক্রেগ এসটি

97

ঠিক আছে, ASCII কোডে, সংখ্যাগুলি (সংখ্যাগুলি) 48 থেকে শুরু হয় । আপনাকে যা করতে হবে তা হ'ল:

int x = (int)character - 48;

19
@ চ্যাড: কেবলমাত্র বেশি পঠনযোগ্য নয়, এটি আরও বহনযোগ্য। সি এবং সি ++ কোনও এএসসিআইআই প্রতিনিধিত্বের গ্যারান্টি দেয় না, তবে তারা গ্যারান্টি দেয় যে যা উপস্থাপনা ব্যবহৃত হয়, 10 দশমিক সংখ্যার উপস্থাপনাগুলি সংঞ্জক এবং সংখ্যাসমুহিকভাবে হয়।
বেন ভয়েগট

কেবলমাত্র আমি বদলে যাব 48 টি, যা কিছুটা "যাদুকর" বলে মনে হচ্ছে'0'
এরিয়েলগ্রো

59

সি এবং সি ++ সর্বদা কমপক্ষে প্রকারগুলি প্রচার করে int। আরও অক্ষর অক্ষর intসি এবং charসি ++ টাইপ করা হয় ।

আপনি charকেবল একটি নির্দিষ্ট করে একটি ধরণ রূপান্তর করতে পারেন int

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

3
আপনি এই উদ্দেশ্যে খুব খারাপভাবে প্রশংসিত আনারি ব্যবহার করতে পারেন operator+()
কুবিবি

24
-1 প্রশ্নের একমাত্র অর্থবহ ব্যাখ্যার জন্য উত্তরটি ভুল। এটি (কোড int a = c;) এমন কোনও নেতিবাচক মান রাখবে, যা সি স্ট্যান্ডার্ড লাইব্রেরি ফাংশনগুলি মোকাবেলা করতে পারে না। সি স্ট্যান্ডার্ড লাইব্রেরি ফাংশন charমানগুলি হ্যান্ডেল করার অর্থ কী তার জন্য এটি স্ট্যান্ডার্ড সেট করে int
চিয়ার্স এবং এইচটিএইচ - Alf

6
@ ম্যাট: আমি ডাউনটা রাখছি আমি সম্ভব হলে এটি আরও শক্তিশালী করতাম! আপনি এবং অন্যরা যে প্রশ্নটি ব্যাখ্যা করেছেন তা অর্থবহ নয়, কারণ এটি একেবারে তুচ্ছ, এবং কারণগুলির ওপির নির্দিষ্ট সংমিশ্রণের জন্য খুব তুচ্ছ-তাত্পর্যপূর্ণ গুরুত্বপূর্ণ বিষয় নয় issue আপনি যে পরামর্শ দিচ্ছেন তা সরাসরি নবজাতকের পক্ষে বিপদজনক । এটি সম্ভবত তাদের প্রোগ্রামের সি স্ট্যান্ডার্ড লাইব্রেরি চরিত্রের শ্রেণিবিন্যাস ফাংশন ব্যবহার করে অনির্ধারিত আচরণের ফলাফল করবে । রেফ সায়ামের উত্তরটিতে, সে উত্তরটি মুছে ফেলেছে।
চিয়ার্স এবং এইচটিএইচ - আলফ

3
ভুল হওয়ার জন্য -1: 1252 হাইবিট চরিত্রটি পাস করা হলে ইস্পার () এর অপরিজ্ঞাত ফলাফল হবে।
ক্রিস বেক

1
"সর্বদা প্রচার" বলতে আপনার অর্থ কী? মানগুলি অন্তর্নিহিত রূপান্তরকালে, নির্দিষ্ট ধরণের প্যারামিটারগুলি পাস করার সময় প্রচার করা হয় (উদাহরণস্বরূপ, একটি ভারার্গস ফাংশনে), এবং যখন কোনও অপারেটর অবশ্যই তার অপারেশনগুলিকে সামঞ্জস্যপূর্ণ ধরণের করে তোলে। তবে অবশ্যই এমন কিছু সময় রয়েছে যখন কোনও মান প্রচার করা হয় না (যেমন আমি যদি একটি চরের প্রত্যাশা করা কোনও ফাংশনটিতে একটি গৃহীত করি), অন্যথায় আমাদের কোনও প্রকারের চেয়ে ছোট কোনও প্রকার নেই।
অ্যাড্রিয়ান ম্যাকার্থি

31

চরটি একটি 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
রোল্যান্ড ইলিগ

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.

মনে রাখবেন যে 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 কাছাকাছি.


12

ব্যবহার static_cast<int>:

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

সম্পাদনা: আপনার সম্ভবত ব্যবহার এড়াতে চেষ্টা করা উচিত(int)

int num = (int) চিঠি;

চেক আউট কেন (ইনট) এক্স এর পরিবর্তে স্ট্যাটিক_কাস্ট <int> (এক্স) ব্যবহার করবেন? আরও তথ্যের জন্য.


7

এটি ধরণের "রূপান্তর" দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে।

ব্যবহারের মত একটি বিশেষ উদ্দেশ্য রূপান্তর: আপনি যে একটি পূর্ণসংখ্যা প্রতিনিধিত্ব করে, "123456" মত অক্ষরের একটি সিরিজ আছে, তাহলে সেখানে কি যে সি দুটি টিপিক্যাল উপায় আছে আপনি atoi () বা strtol () , অথবা সাধারণ যদি sscanf () । সি ++ (যা আপগ্রেড হিসাবে সত্যই আলাদা ভাষার মুখোশযুক্ত) একটি তৃতীয়, স্ট্রিংস্ট্রিম যুক্ত করে।

যদি আপনি বোঝাতে চান যে আপনি চান যে কোনও একটি 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;
}

এই কোডটি দ্রুত অনির্ধারিত আচরণের দিকে আহ্বান করে এবং তাই অনুলিপি এবং আটকানোর পক্ষে উপযুক্ত নয়। (
পূর্ব

4

সম্ভবত আপনি সি স্ট্যান্ডার্ড লাইব্রেরি থেকে ফাংশন ব্যবহার করার জন্য এই রূপান্তরটি চান।

সেক্ষেত্রে (সি ++ সিনট্যাক্স) করুন

typedef unsigned char UChar;

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

নেতিবাচক মানগুলি থেকে মুক্তি পাওয়ার জন্য অভিব্যক্তি UChar( c )রূপান্তরিত হয় unsigned char, যা, ইওএফ ব্যতীত সি ফাংশন দ্বারা সমর্থিত নয়।

তারপরে সেই অভিব্যক্তির ফলাফলটি একটি intআনুষ্ঠানিক যুক্তির আসল যুক্তি হিসাবে ব্যবহৃত হয় । যেখানে আপনি স্বয়ংক্রিয়ভাবে প্রচার পাবেন int। আপনি বিকল্পভাবে শেষ ধাপটি স্পষ্টভাবে লিখতে পারেন, পছন্দ করতে পারেন int( UChar( c ) ), তবে ব্যক্তিগতভাবে আমি এটি খুব ভার্জোজ মনে করি।

চিয়ার্স এবং এইচটিএইচ,


0

চার্ট অ্যারেটিকে "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;
}

আশা করি এটা সাহায্য করবে!


আপনি কি কখনও এই কোডটি পরীক্ষা করেছেন? 50 টি 48 হওয়া উচিত, 55 কেবলমাত্র বড় হাতের ASCII অক্ষরের জন্য কাজ করে যখন আপনার উদাহরণে ছোট হাতের অক্ষর রয়েছে।
রোল্যান্ড ইলিগ

0

চর বা সংক্ষিপ্ত থেকে ইনট করার জন্য, আপনাকে কেবল মান নির্ধারণ করতে হবে।

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/references/cstdlib/atoi/ , http://www.cplusplus.com/references/string/stoi/ দেখুন


1
এটি অনির্ধারিত আচরণ। চর ভেরিয়েবলের ঠিকানা নিলে আপনাকে একটি চর দেওয়া হবে * তবে সি-স্ট্রিং নয়, যা আটোই প্রত্যাশা করে।
luizfls
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.