web-dev-qa-db-ja.com

単一の文字をintに変換する方法

私は数字の文字列を持っています、例えば「123456789」。計算で使用するには、それぞれを抽出する必要があります。もちろん、インデックスによって各文字にアクセスできますが、どのようにintに変換できますか?

私はatoi()を調べましたが、引数として文字列を取ります。したがって、各文字を文字列に変換してから、atoiを呼び出す必要があります。もっと良い方法はありますか?

54
jonsb

数字の文字エンコードがすべて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'はるかに読みやすい。

135
Binary Worrier
#define toDigit(c) (c-'0')
20
Antonius RC

または、元のatoiアプローチに似た「正しい」メソッドを使用できますが、代わりにstd :: stringstreamを使用します。これは、文字列だけでなく入力として文字を使用する必要があります。 (boost :: lexical_castは、より便利な構文の別のオプションです)

(atoiは古いC関数であり、可能な限り、より柔軟でタイプセーフなC++の同等物を使用することをお勧めします。std:: stringstreamは、文字列との間の変換をカバーします)

8
jalf

Atoi()関数を使用できます

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]){
    int num ;
    num = atoi(argv[1]);
    printf("\n%d", num);
}
4
arun.rajput

提供される回答は、アラビア数字のみを扱いたい場合に限りすばらしいものであり、それらの数字が連続しているエンコードで、ASCIIと同じ場所で機能しています。

これはほとんどの場合に当てはまります。

そうでない場合は、適切なライブラリが必要です。

[〜#〜] icu [〜#〜] から始めましょう。

  1. 最初にバイト文字列をユニコード文字列に変換します。 (読者のための演習として左)。
  2. 次に、 char.h を使用して各文字を調べます。
  3. 文字がUBool u_isdigit (UChar32 c)の場合
  4. 値はint32_t u_charDigitValue ( UChar32 c )です

または多分ICUはあなたのためにそれを行うための機能を持っています-私はそれを詳細に見ていません。

3
Douglas Leeder
#include<iostream>
#include<stdlib>
using namespace std;

void main()
{
     char ch;
     int x;
     cin >> ch;
     x = char (ar[1]);
     cout << x;
}
2
haidernute

次の方法で何か問題がありますか?

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;
    }
}
1
jonsb

areエンコードが心配な場合は、いつでもswitchステートメントを使用できます。

これらの大きな数値を保持する形式に注意してください。一部のシステムでの整数の最大サイズは、65,535(32,767符号付き)ほどです。他のシステムでは、2,147,483,647(または4,294,967,295符号なし)があります。

1
user54650

この方法で、charをintに、intをcharに簡単に変換できます。

int charToInt(char c)
{
   int arr[]={0,1,2,3,4,5,6,7,8,9};
   return arr[c-'0'];
}
1
Ravi Singh

私にとって、以下は非常にうまくいきました:

QChar c = '5';
int x = c.digitValue();
// x is now 5

ドキュメント: int QChar :: digitValue()const これは次のとおりです。

数字の数値を返します。文字が数字でない場合は-1を返します。

0
KYL3R