تحويل رقم حرف إلى العدد الصحيح المقابل في C
-
07-07-2019 - |
سؤال
هل هناك طريقة لتحويل الحرف إلى عدد صحيح في لغة C؟
على سبيل المثال، من '5'
إلى 5؟
المحلول
وكما في ردود أخرى، وهذا على ما يرام:
char c = '5';
int x = c - '0';
وأيضا، لفحص الخطأ، قد ترغب في التحقق isdigit (ج) غير صحيح أولا. لاحظ أنه لا يمكنك تماما تنقليا تفعل الشيء نفسه للرسائل، على سبيل المثال:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
والضمانات معيار أن القيم شار للأرقام '0' إلى '9' هي متجاورة، ولكن لا تقدم أي ضمانات لشخصيات أخرى مثل الحروف الأبجدية.
نصائح أخرى
وإطرح "0" مثل هذا:
int i = c - '0';
ويضمن C القياسية كل رقم في '0'..'9'
نطاق أكبر واحد من الرقم السابق (في قسم 5.2.1/3
من في C99 مشروع ). نفس التهم لC ++.
إذا، من قبل بعض صدفة مجنونة، تريد تحويل سلسلة م> الأحرف إلى عدد صحيح، يمكنك أن تفعل ذلك أيضا!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
وval
هو الآن على ما يبدو 1024. atoi()
على ما يرام، وما قلته حول هذا ينطبق فقط في وقت سابق لي (على OS X (ربما (إدراج نكتة يسب هنا))). لقد سمعت أنه ماكرو خرائط تقريبا المثال التالي، والذي يستخدم 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()
وجدت (ولكن من يهتم بذلك).
اطرح الحرف '0' أو int 48 مثل هذا:
char c = '5';
int i = c - '0';
توضيح:داخليا يعمل مع أسكي قيمة.من جدول ASCII، القيمة العشرية للحرف 5 هو 53 و 0 هو 48.لذا 53 - 48 = 5
أو
char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48
يعني إذا خصمت 48 من أي حرف رقمي، فإنه سيتم تحويل عدد صحيح تلقائيا.
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
لتحويل أرقام حرف إلى عدد صحيح المقابلة. لا كما هو موضح أدناه:
char c = '8';
int i = c - '0';
والمنطق وراء العملية الحسابية أعلاه هو للعب مع قيم ASCII. قيمة ASCII للحرف 8 هي 56، قيمة ASCII للحرف 0 هو 48. قيمة ASCII من عدد صحيح 8 هو 8.
إذا طرحنا حرفين، فإن الطرح يحدث بين ASCII من الأحرف.
int i = 56 - 48;
i = 8;
إذا كان مجرد حرف واحد 0-9 في ASCII، ثم طرح قيمة ASCII حرف الصفر من قيمة ASCII يجب أن تعمل بشكل جيد.
إذا كنت تريد تحويل أعداد أكبر ثم التالية سوف تفعل:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
و** لا تنسى للتحقق من حالة (والذي يجب أن يكون 1 ما اذا كان يعمل في الحالة المذكورة أعلاه).
وبول.
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 !!!
}
عند يجب أن أفعل شيئا من هذا القبيل I prebake صفيف مع القيم أريد.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
وبعد ذلك التحويل السهل
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
وهذا هو في الأساس النهج من قبل العديد من تطبيقات المكتبة الأساسية CType اتخاذها. يمكنك التكيف بشكل مسلي هذا العمل مع الأرقام عرافة جدا.
افحص هذا،
char s='A';
int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);
فقط 0,1,2,....,E,F.
ومجرد استخدام atol()
function:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
إذا الرقم الخاص بك هو، مثلا، '5'
، في ASCII تتمثل بأنها 0011 0101
عدد ثنائي (53). كل رقم لديه أعلى أربعة بت 0011
و الأدنى 4 بت تمثل الرقم في الوسط التجاري. لذلك كنت تفعل
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
للحصول على أقل 4 بت، أو ما في نفسه، وأرقام. في تعدين الذهب حرفيا، فإنه يستخدم عملية and
بدلا من sub
(كما في إجابات أخرى).
واستخدام وظيفة: atoi للمجموعة إلى عدد صحيح، atof لمجموعة لتعويم نوع. أو
char c = '5';
int b = c - 48;
printf("%d", b);
ويمكنك أن يلقي ذلك إلى int (أو تعويم أو مزدوج أو ما من أي وقت مضى آخر كنت تريد أن تفعل معها) وتخزينها في anoter متغير.