Cで文字を整数に変換する方法はありますか?
たとえば、'5'
から5まで?
他の回答によると、これは問題ありません。
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'
の範囲内の各桁がその前の桁( C99ドラフト のセクション5.2.1/3
)よりも1大きいことが保証されています。 C++についても同様です。
偶然の一致で、文字のstringを整数に変換したい場合は、それもできます!
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
番号であるかのように処理します。 **endptr
がnullでない場合、最初に検出されたstrtol()
の最初の非数字文字を保持します(ただし、それを気にする人は)。
次のようにchar '0'またはint 48を減算します。
char c = '5';
int i = c - '0';
説明:内部的には ASCII 値で動作します。 ASCIIテーブルから、文字の10進数値5は53であり、0は48。したがって53-48 = 5
OR
char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48
つまり、任意の数字から48を差し引くと、整数が自動的に変換されます。
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
文字数字を対応する整数に変換します。次のように実行します。
char c = '8';
int i = c - '0';
上記の計算の背後にあるロジックは、ASCII値で遊ぶことです。 ASCII文字8の値は56、ASCII文字0の値は48です。ASCII整数8の値は8です。
2文字を減算すると、ASCII文字の間で減算が行われます。
int i = 56 - 48;
i = 8;
ASCIIの0〜9の単一文字の場合、ASCII値からASCIIゼロ文字の値を引くと正常に機能します。
より大きな数値を変換する場合は、次のようにします。
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
**ステータスを確認することを忘れないでください(上記のケースで機能した場合は1でなければなりません)。
ポール。
これを確認してください
char s='A';
int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);
0,1,2、....、E、Fのみ。
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 !!!
}
たとえば、'5'
の場合、ASCIIの2進数0011 0101
(53)として表されます。すべての桁には、0011
の上位4ビットがあり、下位4ビットはbcdの桁を表します。だからあなたはただやる
char cdig = '5';
int Dig = cdig & 0xf; // Dig contains the number 5
最下位の4ビット、またはそれと同じ数字を取得します。 asmでは、(他の回答のように)and
の代わりにsub
操作を使用します。
atol()
functionを使用するだけです:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
このようなことをする必要があるとき、必要な値で配列をプリベークします。
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の数字をintに、またはその逆に変換できるヘルパー関数です。
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}