문제
나는 "123456789"와 같은 숫자를 가지고 있으며, 계산에 그것들을 사용하려면 각각을 추출해야합니다. 물론 인덱스별로 각 Char에 액세스 할 수는 있지만 int로 어떻게 변환합니까?
나는 atoi ()를 살펴 보았지만 인수로 문자열이 필요합니다. 따라서 각 숯을 문자열로 변환 한 다음 atoi를 호출해야합니다. 더 좋은 방법이 있습니까?
해결책
숫자의 문자 인코딩이 모두 48 ( '0')에서 57 ( '9'의 경우)이라는 사실을 활용할 수 있습니다. 이것은 ASCII, UTF-X 및 실질적으로 다른 모든 인코딩에 적용됩니다 (자세한 내용은 아래의 의견을 참조하십시오).
따라서 모든 숫자의 정수 값은 숫자 마이너스 '0'(또는 48)입니다.
char c = '1';
int i = c - '0'; // i is now equal to 1, not '1'
동의어입니다
char c = '1';
int i = c - 48; // i is now equal to 1, not '1'
그러나 나는 첫 번째를 발견했다 c - '0'
훨씬 더 읽기 쉬운.
다른 팁
#define toDigit(c) (c-'0')
또는 원래 ATOI 접근 방식과 유사한 "올바른"메소드를 사용할 수 있지만 대신 std :: stringstream과 함께 사용할 수 있습니다. 문자열뿐만 아니라 입력으로 숯으로 작동해야합니다. (부스트 :: lexical_cast는보다 편리한 구문을위한 또 다른 옵션입니다)
(Atoi는 기존 C 함수이며 일반적으로 가능한 경우보다 유연하고 Typeafe C ++ 등가를 사용하는 것이 좋습니다. std :: stringstream은 문자열로의 변환을 커버합니다)
atoi () 함수를 사용할 수 있습니다
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]){
int num ;
num = atoi(argv[1]);
printf("\n%d", num);
}
제공된 답변은 아랍어 숫자 만 처리하려는 한 훌륭하며 해당 숫자가 순차적이며 ASCII와 동일한 위치에서 인코딩에서 작동합니다.
이것은 거의 항상 그렇습니다.
그렇지 않은 경우 적절한 라이브러리가 필요합니다.
시작하겠습니다 ICU.
- 먼저 바이트 스트링을 유니 코드 문자열로 변환합니다. (독자를위한 운동으로 남겨 둡니다).
- 그런 다음 사용하십시오 uchar.h 각 캐릭터를보기 위해.
- 우리가 캐릭터라면
UBool u_isdigit (UChar32 c)
- 그러면 가치는입니다
int32_t u_charDigitValue ( UChar32 c )
또는 ICU가 당신을 위해 그것을 할 수있는 기능이있을 수 있습니다. 나는 그것을 자세히 보지 않았습니다.
#include<iostream>
#include<stdlib>
using namespace std;
void main()
{
char ch;
int x;
cin >> ch;
x = char (ar[1]);
cout << x;
}
만약 너라면 ~이다 인코딩에 대해 걱정하면 언제든지 스위치 문을 사용할 수 있습니다.
많은 숫자를 유지하는 형식에주의하십시오. 일부 시스템의 정수의 최대 크기는 65,535 (32,767 서명)만큼 낮습니다. 다른 시스템, 당신은 2,147,483,647 (또는 4,294,967,295 Unsigned)을 가지고 있습니다.
다음과 같은 방법에 문제가 있습니까?
int CharToInt(const char c)
{
switch (c)
{
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
default:
return 0;
}
}
이렇게하면 char를 int로, int로 쉽게 변환 할 수 있습니다.
int charToInt(char c)
{
int arr[]={0,1,2,3,4,5,6,7,8,9};
return arr[c-'0'];
}
나에게 다음은 꽤 잘 작동했습니다.
QChar c = '5';
int x = c.digitValue();
// x is now 5
선적 서류 비치: int QCHAR :: DIGITVALUE () const 말한다 :
문자가 숫자가 아닌 경우 숫자의 숫자 값을 반환하거나 -1을 반환합니다.