programing

C의 char to int 변환

telebox 2023. 8. 10. 18:43
반응형

C의 char to int 변환

의 숫자를 하려면 일단숫변려는경우하환를자우경.char예를 들어 다음과 같은 경우에는 숫자 값이 됩니다.

char c = '5';

그리고 나는 원합니다.c붙잡기 위해5'5'이렇게 하면 100% 휴대가 가능합니까?

c = c - '0';

모든 문자 집합이 숫자를 연속적으로 저장한다고 해서 그렇게 생각합니다만, 이 변환을 할 수 있는 체계적인 라이브러리 기능이 있는지, 그리고 전통적으로 어떻게 하는지 알고 싶습니다.저는 정말 초보자입니다 :)

예, 안전한 변환입니다.C는 그것이 작동하도록 요구합니다.이 보증은 최신 ISO C 표준의 섹션 5.2.1 제2항에 있으며, 최근 초안은 N1570입니다.

기본 소스 및 기본 실행 문자 집합 모두 다음과 같은 구성원을 가져야 합니다.
[...]
십진법.
0 1 2 3 4 5 6 7 8 9
[...]
소스 및 실행 기본 문자 집합 모두에서 위의 소수 자릿수 목록에서 0 뒤에 있는 각 문자의 값은 이전 문자의 값보다 1 커야 합니다.

ASCII와 EBCDIC, 그리고 이들로부터 파생된 문자 집합은 모두 이 요구 사항을 충족하며, 이것이 C 표준이 이 요구 사항을 부과할 수 있었던 이유입니다.문자는 연속적인 IN EBCDIC가 아니며 C는 문자가 연속적일 필요가 없습니다.

단일에 대해 수행할 라이브러리 기능이 없습니다.char먼저 문자열을 작성해야 합니다.

int digit_to_int(char d)
{
 char str[2];

 str[0] = d;
 str[1] = '\0';
 return (int) strtol(str, NULL, 10);
}

당신은 또한 사용할 수 있습니다.atoi(), 일단당문가자있지다고면변, 하기능는을환을열신이▁function▁to.strtol()더 좋고 안전합니다.

그러나 논평가들이 지적했듯이, 이 변환을 수행하기 위한 함수를 호출하는 것은 극도의 과잉 행동입니다. '0'을 빼는 초기 접근 방식이 이를 수행하는 적절한 방법입니다.여기서는 문자열로 된 숫자를 "참" 숫자로 변환하는 권장 표준 접근 방식이 어떻게 사용되는지 보여주고 싶었습니다.

사용해 보십시오.

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

예를 들어 문자가 'a'인 경우 91 - 48 = 49가 됩니다.특히 사용자 또는 네트워크 입력을 처리하는 경우에는 프로그램에서 잘못된 동작을 방지하기 위해 유효성 검사를 수행해야 합니다.범위만 확인하면 됩니다.

if ('0' <= c &&  c <= '9') {
    i = c - '0';
} else {
    /* handle error */
}

변환에서 16진수를 처리하려면 범위를 확인하고 적절한 계산을 수행할 수 있습니다.

if ('0' <= c && c <= '9') {
    i = c - '0';
} else if ('a' <= c && c <= 'f') {
    i = 10 + c - 'a';
} else if ('A' <= c && c <= 'F') {
    i = 10 + c - 'A';
} else {
    /* handle error */
}

그러면 대문자 또는 소문자와 관계없이 단일 16진수 문자가 정수로 변환됩니다.

표준 라이브러리의 일부인 를 사용할 수 있습니다.

하나의 문자만 변환하기 때문에 함수 atoi()가 오버킬입니다.toy()는 숫자의 문자열 표현을 변환할 때 유용합니다.다른 게시물들은 이에 대한 예를 제시했습니다.제가 당신의 게시물을 올바르게 읽는다면, 당신은 숫자 하나만 변환하는 것입니다.따라서 0에서 9 사이의 문자만 변환합니다.하나의 숫자만 변환하는 경우 '0'을 빼라는 제안은 원하는 결과를 제공합니다.이것이 작동하는 이유는 ASCII 값이 연속적이기 때문입니다(당신이 말한 것처럼).따라서 숫자 문자에서 ASCII 값 0(ASCII 값 48 - 값은 ASCII참조)을 빼면 숫자 값이 표시됩니다.c = c - '0'의 예를 들어 보겠습니다. 여기서 c = '5', 실제로 발생하는 것은 53(ASCII 값 5) - 48(ASCII 값 0) = 5입니다.

처음에 이 답변을 게시했을 때, 저는 다른 문자 집합 간에 100% 이동 가능하다는 당신의 의견을 고려하지 않았습니다.주변을 좀 더 둘러봤는데, 여전히 당신의 답변이 대부분 맞는 것 같습니다.문제는 당신이 8비트 데이터 유형인 char를 사용하고 있다는 것입니다.모든 종류의 캐릭터에 적용되는 것은 아닙니다.유니코드에 대한 자세한 내용은 Joel Spolsky의 유니코드 관련 기사를 참조하십시오.이 기사에서 그는 캐릭터에 wchar_t를 사용한다고 말합니다.이것은 그에게 잘 먹혔고 그는 29개 언어로 그의 웹사이트를 게시합니다.따라서 char를 wchar_t로 변경해야 합니다.그 외에 127 이하의 캐릭터는 기본적으로 같다고 합니다.여기에는 숫자를 나타내는 문자가 포함됩니다.이것은 여러분이 제안한 기본적인 수학이 여러분이 성취하려고 했던 것에 적용되어야 한다는 것을 의미합니다.

예. 이 예와 같이 표준 ASCII 문자를 사용하는 경우 안전합니다.

일반적으로, 당신의 입력이 '0'이라는 보장이 없다면..'9' 범위에서는 다음과 같은 검사를 수행해야 합니다.

if (c >= '0' && c <= '9') {
    int v = c - '0';
    // safely use v
}

또는 룩업 테이블을 사용할 수도 있습니다.보다 적은 코드(또는 더 빠른 코드)로 간단한 범위 확인 및 변환을 수행할 수 있습니다.

// one-time setup of an array of 256 integers;
// all slots set to -1 except for ones corresponding
// to the numeric characters
static const int CHAR_TO_NUMBER[] = {
    -1, -1, -1, ...,
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // '0'..'9'
    -1, -1, -1, ...
};

// Now, all you need is:

int v = CHAR_TO_NUMBER[c];

if (v != -1) {
    // safely use v
}

추신. 이건 과잉 살상이라는 걸 압니다.저는 그것을 당장은 분명하지 않을 수도 있는 대안으로 제시하고 싶었습니다.

다른 사람들이 제안했지만 기능으로 포장되었습니다.

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

이제 그 기능을 사용하세요.나중에 다른 방법을 사용하기로 결정한 경우에는 구현(성능, 문자 집합 차이 등)만 변경하면 되므로 발신자를 변경할 필요가 없습니다.

이 버전에서는 c에 숫자를 나타내는 문자가 포함되어 있다고 가정합니다.함수를 호출하기 전에 ctype을 사용하여 확인할 수 있습니다.h의 자릿수 함수.

'0', '1', '2'...의 ASCII 코드는 48부터 57까지 배치되므로 기본적으로 연속적입니다.이제 산술 연산은 차트 유형을 int 데이터 유형으로 변환해야 합니다.따라서 기본적으로 수행하는 작업은 53-48입니다. 따라서 정수 연산을 수행할 수 있는 값 5가 저장됩니다.int에서 char로 다시 변환하는 동안 컴파일러는 오류를 발생시키지 않고 모듈로 256 연산을 수행하여 값을 허용 가능한 범위로 설정합니다.

간단히 사용할 수 있습니다.atol()함수:

#include <stdio.h>
#include <stdlib.h>

int main() 
{
    const char *c = "5";
    int d = atol(c);
    printf("%d\n", d);

}

언급URL : https://stackoverflow.com/questions/781668/char-to-int-conversion-in-c

반응형