「123456789」などの数字の文字列があり、計算で使用するには、それぞれを抽出する必要があります。もちろん、各 char にインデックスでアクセスできますが、どうすれば int に変換できますか?
atoi() を調べましたが、文字列を引数として取ります。したがって、各 char を文字列に変換してから、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;
}
エンコードが心配 な場合は、いつでも 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'];
}
@jalfに同意します。sstreamライブラリとstoiを使用することが推奨されるアプローチのようです。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
stringstream st;
st << 1 << '2';
cout << stoi(st.str()) + 1;
return 0;
}
13
私は C++ の新入生ですが、LAMP スタックの長年の開発者です。文字列クラスに、文字と文字列の間をスムーズに移行するためのものがもっとあることを望んでいましたが、ネイティブでサポートされているものはまだ見つかりません。