developer tip

문자 숫자를 C의 해당 정수로 변환

optionbox 2020. 9. 5. 09:45
반응형

문자 숫자를 C의 해당 정수로 변환


C에서 문자를 정수로 변환하는 방법이 있습니까?

예를 들어에서 '5'5까지?


다른 답변에 따라 이것은 괜찮습니다.

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

또한 오류 검사를 위해 isdigit (c)가 참인지 먼저 확인하는 것이 좋습니다. 예를 들어 다음과 같이 문자에 대해 완전히 이식 할 수는 없습니다.

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

표준은 숫자 '0'에서 '9'까지의 char 값이 연속적임을 보장하지만 알파벳 문자와 같은 다른 문자에 대해서는 보장하지 않습니다.


다음과 같이 '0'을 뺍니다.

int i = c - '0';

표준 C의 범위에있는 각 디지트를 보장한다 '0'..'9'(섹션에서 이전 자리에 1을 더한 5.2.1/3C99 초안 ). C ++도 마찬가지입니다.


우연의 일치로 문자열 을 정수 로 변환 하려면 그렇게 할 수도 있습니다!

char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int

val지금은 1024입니다. 분명히 atoi()괜찮습니다. 앞서 언급 한 내용은 저에게만 적용됩니다 (OS X (여기에 Lisp 농담 삽입)). 다음 예제에 대략적으로 매핑되는 매크로라고 들었습니다.이 매크로 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숫자 인 것처럼 처리합니다 . **endptrnull이 아닌 경우 strtol()발견 된 첫 번째 숫자가 아닌 문자를 보유합니다 (하지만 누가 신경 쓰는지).


char numeralChar = '4';
int numeral = (int) (numeralChar - '0');

다음과 같이 char '0'또는 int 48을 뺍니다.

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

설명 : 내부적으로 ASCII 값으로 작동 합니다. ASCII 테이블에서 문자 5 의 10 진수 값 은 53 이고 0은 48 입니다. 따라서 53-48 = 5

또는

char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48

, 숫자 문자에서 48 을 빼면 정수가 자동으로 변환됩니다.


문자 숫자를 해당 정수로 변환합니다. 다음과 같이하십시오.

char c = '8';                    
int i = c - '0';

위 계산의 논리는 ASCII 값을 사용하는 것입니다. 문자 8의 ASCII 값은 56, 문자 0의 ASCII 값은 48입니다. 정수 8의 ASCII 값은 8입니다.

두 문자를 빼면 ASCII 문자 사이에서 빼기가 발생합니다.

int i = 56 - 48;   
i = 8;

ASCII의 단일 문자 0-9 인 경우 ASCII 값에서 ASCII 0 문자의 값을 빼면 정상적으로 작동합니다.

더 큰 숫자를 변환하려면 다음을 수행하십시오.

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 !!!
}

이와 같은 작업을 수행해야 할 때 원하는 값으로 배열을 미리 굽습니다.

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 라이브러리의 많은 구현에서 취하는 접근 방식입니다. 16 진수로도 작동하도록 이것을 간단하게 조정할 수 있습니다.


이것을 확인하십시오.

char s='A';

int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);

0,1,2, ...., E, F에만 해당됩니다.


다음 atol()기능을 사용하십시오 .

#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)로 표시됩니다. 모든 숫자는 가장 높은 4 비트를 0011가지며 가장 낮은 4 비트는 bcd의 숫자를 나타냅니다. 그래서 당신은

char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5

to get the lowest 4 bits, or, what its same, the digit. In asm, it uses and operation instead of sub(as in the other answers).


Here are helper functions which allow to convert digit in char to int and vice versa:

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

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

use function: atoi for array to integer, atof for array to float type; or

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

You would cast it to an int (or float or double or what ever else you want to do with it) and store it in anoter variable.

참고URL : https://stackoverflow.com/questions/628761/convert-a-character-digit-to-the-corresponding-integer-in-c

반응형