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
'programing' 카테고리의 다른 글
MutableLiveData에서 setValue()와 postValue()의 차이 (0) | 2023.08.10 |
---|---|
파이썬으로 문자열이 숫자로 시작하는지 확인하는 방법은 무엇입니까? (0) | 2023.08.10 |
프래그먼트로 데이터 바인딩을 사용하는 방법 (0) | 2023.08.10 |
Raspberry Pi4, mariadb 설치, mysql command에서 문제를 찾을 수 없습니다. (0) | 2023.08.10 |
babel-polyfill 라이브러리는 어떻게 설치합니까? (0) | 2023.08.10 |