অক্ষরের অঙ্কটিকে সি-তে সম্পর্কিত সংখ্যায় রূপান্তর করুন


103

কোনও চরিত্রকে সি-তে পূর্ণসংখ্যায় রূপান্তর করার কোনও উপায় আছে কি?

উদাহরণস্বরূপ, '5'5 থেকে ?

উত্তর:


148

অন্যান্য জবাব অনুসারে, এটি ঠিক আছে:

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

এছাড়াও, ত্রুটি পরীক্ষা করার জন্য, আপনি প্রথমে isdigit (সি) পরীক্ষা করতে চাইতে পারেন। নোট করুন যে আপনি সম্পূর্ণরূপে অক্ষরের জন্য একইভাবে করতে পারবেন না, উদাহরণস্বরূপ:

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

স্ট্যান্ডার্ডটি গ্যারান্টি দেয় যে '0' থেকে '9' ডিজিটের জন্য চর মানগুলি সামঞ্জস্যপূর্ণ তবে বর্ণের অক্ষরের মতো অন্যান্য অক্ষরের জন্য কোনও গ্যারান্টি দেয় না।


3
@ পল টম্বলিন: হ্যাঁ চিঠির জন্য অঙ্কগুলির জন্য নয়, কারণ আমি উত্তরে বলেছি, '0' থেকে '9' মানক গ্যারান্টিটি সুসংগত তবে অন্যান্য অক্ষরের যেমন 'এ' থেকে 'জেড' এর জন্য এই ধরনের গ্যারান্টি দেয় না।
ক্রিস ইয়ং

চর সি = 'বি'; int x = c - 'a'; তাহলে এক্স কেবল এএসসিআইতে 1 হবে?
পান 2

@ পান ASCII সহ যে কোনও এনকোডিংয়ে এতে 'এ' এর চেয়ে 'বি' 1 বেশি রয়েছে। এটি এখনও EBCDIC এ সত্য রয়েছে, তবে এটি ('জে' - 'আই') == ৮ করে তোলে
ক্রিস ইয়ং

@ ক্রিস ইউং কেন? EBCDIC এর কারণ, 'j' 'i' এর চেয়ে 1 বেশি নয়?
পান

2
আমি এখানে কি অনুপস্থিত যেখানে আতোই ব্যবহৃত হয় না?
ড্যানিয়েল

41

'0' এর মতো বিয়োগ করুন:

int i = c - '0';

সি স্ট্যান্ডার্ড গ্যারান্টী বা নিশ্চয়তা দিচ্ছে সীমার মধ্যে প্রতিটি অঙ্ক '0'..'9'তার পূর্ববর্তী অঙ্ক (বিভাগে থেকেও মহান কিছু 5.2.1/3এর C99 খসড়া )। সি ++ এর জন্য একই গণনা।


1
এই উত্তরটি আরও ভাল হবে যদি আপনি উল্লেখ করেন যে একটি চরটি ইতিমধ্যে কার্যকরভাবে কার্যকর ইন্টিজার, বাস্তবায়নের সংজ্ঞায়িত চিহ্ন (যেমন, স্বাক্ষরিত বা স্বাক্ষরযুক্ত) হতে পারে এবং CHAR_BITS দীর্ঘ হয়।
আরাফাঙ্গিয়ন

আমি নিশ্চিত যে এটি সত্যই তাকে সাহায্য করে নিশ্চিত ছিল না। তবে ক্রিস একটি..জেনের সাথে একটি ভাল বক্তব্য রেখেছিলেন যে অগত্যা সংগত নয়। পরিবর্তে আমি এটি উল্লেখ করা উচিত ছিল। এখন সে রেসটি জিতেছে :)
জোহানেস স্কাউব - 3

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()পাওয়া অ-অঙ্কের অক্ষর ধারণ করে (তবে কে এটি সম্পর্কে চিন্তা করে)।


আতোইয়ের সাথে কোনও থ্রেডের সমস্যা নেই (এটির কোনও স্থির ডেটা নেই) এবং এটি অবহেলা করা হয় না। বাস্তবে এটি কার্যত সমান: # ডিফাইন আতই (এক্স) (ইনট) (স্ট্র্টল ((এক্স), এন ইউ এল এল, 10)
ইভান তেরান

5
আতোইয়ের সমস্যাটি হ'ল এটি 0 ব্যবহার করে "এখানে একটি সংখ্যা খুঁজে পাবে না" মান হিসাবে, তাই অটোয় ("0") এবং আতোই ("একটি") উভয়ই ফিরে আসে 0 যদি এটি আপনার পক্ষে কাজ না করে তবে ' এটির জন্য পুনরায় ব্যবহার করুন, স্ট্র্টল () বা এসস্কানফ () সন্ধান করুন।
ডেভিড থর্নলি

অবশ্যই স্ট্রটলের অন্যান্য সুবিধাটি হ'ল আপনার সংখ্যার পরে একই স্ট্রিং থেকে অন্যান্য জিনিসগুলি পড়ার প্রয়োজন হতে পারে।
dfeuer

@ ইভেনটেনান দুর্ভাগ্যক্রমে আপনি যদি ভিজ্যুয়াল স্টুডিও পরিচালনা করেন তবে আপনি হ্রাসের সতর্কতা পেয়ে যাবেন (এবং অক্ষম না করে সংকলনটি অর্জন করবেন না)। ভিএস এখনই সুপারিশ করে itoa_s()
সাইমন

7

চর '0' বা int 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 AS পূর্ণসংখ্যার ASCII মান 8 হয়।

আমরা যদি দুটি অক্ষর বিয়োগ করি তবে অক্ষরের ASCII এর মধ্যে বিয়োগ ঘটে।

int i = 56 - 48;   
i = 8;

আমি কেন এটাকে উত্সাহিত করার একমাত্র ব্যক্তি? ব্যাখ্যাটি এত সহজ এবং তথ্যবহুল: +1:
ব্র্যান্ডন বেনিফিল্ড

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

যখন আমাকে এর মতো কিছু করার দরকার হয় তখন আমি যে মানগুলি চাই সেগুলি দিয়ে প্রেরণ করি ake

const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };

তাহলে রূপান্তরটি সহজ is

int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }

এটি মূলত সিটিপি লাইব্রেরির অনেকগুলি প্রয়োগের দ্বারা গৃহীত পদ্ধতি। আপনি হেক্স অঙ্কের সাথেও কাজ করতে তুচ্ছভাবে এটি খাপ খাইয়ে নিতে পারেন।


এটি একক দশমিক (বা অষ্টাল) অঙ্ককে রূপান্তর করার জন্য অত্যন্ত অদক্ষ বলে মনে হচ্ছে। যদি আপনার লক টেবিলের প্রাসঙ্গিক অংশটি 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)
ইাইলেনেস্ক

@ ইাইলেনেস্ক প্রথমে এটি ছিল ৪. ধন্যবাদ। এটি সম্পাদনা।
গর্মেকাইন

0

এখানে সহায়ক ফাংশন যা চারকে ডিজিট রূপান্তর করতে এবং বিপরীতে রূপান্তর করতে দেয়:

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

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

-2

ফাংশনটি ব্যবহার করুন: অ্যারে থেকে পূর্ণসংখ্যার জন্য atoi, অ্যারে থেকে ভাসমান প্রকারের জন্য atof; অথবা

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

বেশ কয়েকটি উত্তর ইতিমধ্যে এটি কভার করেছে। এটি এমন কোনও কিছুই যুক্ত করে যা তারা ইতিমধ্যে coverাকেনি।
শ্যাডোর্যাঞ্জার

-3

আপনি এটিকে কোনও ইনট (বা ভাসমান বা ডাবল বা অন্য আপনি যা করতে চান) নিক্ষেপ করবেন এবং এটি অ্যানোটার ভেরিয়েবলে সংরক্ষণ করবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.