私は数字の文字列を持っています、例えば「123456789」。計算で使用するには、それぞれを抽出する必要があります。もちろん、インデックスによって各文字にアクセスできますが、どのようにintに変換できますか?
私はatoi()を調べましたが、引数として文字列を取ります。したがって、各文字を文字列に変換してから、atoiを呼び出す必要があります。もっと良い方法はありますか?
数字の文字エンコードがすべて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'
はるかに読みやすい。
#define toDigit(c) (c-'0')
または、元のatoiアプローチに似た「正しい」メソッドを使用できますが、代わりにstd :: stringstreamを使用します。これは、文字列だけでなく入力として文字を使用する必要があります。 (boost :: lexical_castは、より便利な構文の別のオプションです)
(atoiは古いC関数であり、可能な限り、より柔軟でタイプセーフなC++の同等物を使用することをお勧めします。std:: stringstreamは、文字列との間の変換をカバーします)
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]){
int num ;
num = atoi(argv[1]);
printf("\n%d", num);
}
提供される回答は、アラビア数字のみを扱いたい場合に限りすばらしいものであり、それらの数字が連続しているエンコードで、ASCIIと同じ場所で機能しています。
これはほとんどの場合に当てはまります。
そうでない場合は、適切なライブラリが必要です。
[〜#〜] icu [〜#〜] から始めましょう。
UBool u_isdigit (UChar32 c)
の場合int32_t u_charDigitValue ( UChar32 c )
ですまたは多分ICUはあなたのためにそれを行うための機能を持っています-私はそれを詳細に見ていません。
#include<iostream>
#include<stdlib>
using namespace std;
void main()
{
char ch;
int x;
cin >> ch;
x = char (ar[1]);
cout << x;
}
次の方法で何か問題がありますか?
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;
}
}
areエンコードが心配な場合は、いつでもswitchステートメントを使用できます。
これらの大きな数値を保持する形式に注意してください。一部のシステムでの整数の最大サイズは、65,535(32,767符号付き)ほどです。他のシステムでは、2,147,483,647(または4,294,967,295符号なし)があります。
この方法で、charをintに、intをcharに簡単に変換できます。
int charToInt(char c)
{
int arr[]={0,1,2,3,4,5,6,7,8,9};
return arr[c-'0'];
}
私にとって、以下は非常にうまくいきました:
QChar c = '5';
int x = c.digitValue();
// x is now 5
ドキュメント: int QChar :: digitValue()const これは次のとおりです。
数字の数値を返します。文字が数字でない場合は-1を返します。