تحويل رقم حرف إلى العدد الصحيح المقابل في C

StackOverflow https://stackoverflow.com/questions/628761

  •  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 متغير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top