回答:
他の返信と同様に、これは問題ありません。
char c = '5';
int x = c - '0';
また、エラーチェックの場合は、最初にisdigit(c)がtrueであることを確認することをお勧めします。たとえば、文字に対して完全に移植可能に同じことを行うことはできないことに注意してください。次に例を示します。
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/3
のC99ドラフト)。C ++の場合も同様です。
たまたま偶然に、文字列を整数に変換したい場合も、それを実行できます。
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
val
どうやら問題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
数であるかのように扱われます。**endptr
がnullでない場合は、最初にstrtol()
見つかった数字以外の文字を保持します(ただし、誰がそれを気にするか)。
itoa_s()
ます。
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
numeralChar - '0'
はすでにタイプint
なので、キャストは必要ありません。そうでなかったとしても、キャストは必要ありません。
文字の数字を対応する整数に変換します。以下のようにしてください:
char c = '8';
int i = c - '0';
上記の計算の背後にあるロジックは、ASCII値で遊ぶことです。文字8のASCII値は56、文字0のASCII値は48です。整数8のASCII値は8です。
2つの文字を減算すると、文字のASCII間で減算が行われます。
int i = 56 - 48;
i = 8;
このようなことをする必要があるときは、必要な値で配列をプリベイクします。
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進数でも機能するように簡単に調整できます。
たとえば、数字が'5'
ASCIIの場合、2進数0011 0101
(53)として表されます。すべての桁には最上位4ビットが0011
あり、最下位4ビットはbcdで桁を表します。だからあなたはただ
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
最下位の4ビット、つまり同じ数字を取得します。asm and
では、sub
(他の回答のように)の代わりに操作を使用します。
'5'
は53(00110101
)
関数を使用:配列から整数へのatoi、配列から浮動小数点型へのatof。または
char c = '5';
int b = c - 48;
printf("%d", b);