質問

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' の範囲の各桁が前の桁(セクション 5.2.1 / 3 C99ドラフト)。 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テーブルから、文字 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変数に格納します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top