質問
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値が連続していることが保証されていますが、アルファベット文字などの他の文字については保証されていません。
他のヒント
何らかの偶然の一致によって、文字の 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テーブルから、文字 5の10進値は53 であり、 0は48 です。 53-48 = 5
または
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値で遊ぶことです。文字8のASCII値は56、文字0のASCII値は48です。整数8のASCII値は8です。
2文字を減算すると、ASCII文字間で減算が行われます。
int i = 56 - 48;
i = 8;
ASCIIの0〜9の1文字だけの場合、ASCII値からASCIIゼロ文字の値を引くと正常に機能します。
より大きな数値を変換する場合は、次のようにします。
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
**ステータスを確認することを忘れないでください(上記のケースで機能した場合は1でなければなりません)。
ポール。
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 !!!
}
このようなことをする必要があるときは、必要な値で配列をプリベークします。
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 s='A';
int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);
0,1,2、....、E、Fのみ。
atol()
関数を使用するだけです:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
数字がたとえば '5'
の場合、ASCIIの場合は2進数の 0011 0101
(53)として表されます。すべての桁には最上位の4ビット 0011
があり、最下位の4ビットはbcdの桁を表します。だからあなたはただ
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
最下位の4ビット、またはそれと同じ数字を取得します。 asmでは、 sub
の代わりに and
操作を使用します(他の回答と同様)。
use関数:配列を整数にするatoi、配列をfloat型にするatof; または
char c = '5';
int b = c - 48;
printf("%d", b);
これをint(またはfloatまたはdoubleまたは他に何をしたいか)にキャストし、それをanoter変数に格納します。