65

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

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

4

11 に答える 11

161

数字の文字コードが 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'方がはるかに読みやすいと思います。

于 2009-01-13T16:10:44.027 に答える
21
#define toDigit(c) (c-'0')
于 2010-12-08T14:50:53.253 に答える
8

または、元の atoi アプローチと同様の「正しい」方法を使用できますが、代わりに std::stringstream を使用します。これは、文字列だけでなく入力としての文字でも機能するはずです。(boost::lexical_cast は、より便利な構文の別のオプションです)

(atoi は古い C 関数であり、可能な場合は、より柔軟で型安全な C++ の同等の関数を使用することをお勧めします。std::stringstream は、文字列との間の変換をカバーしています)

于 2009-01-13T17:03:52.250 に答える
4

atoi() 関数を利用できます

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]){
    int num ;
    num = atoi(argv[1]);
    printf("\n%d", num);
}
于 2016-07-19T10:52:18.367 に答える
3

提供される回答は、アラビア数字のみを処理したい場合に最適であり、それらの数字が連続するエンコーディングで、ASCII と同じ場所で作業しています。

これはほとんど常に当てはまります。

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

まずはICUから。

  1. 最初にバイト文字列を Unicode 文字列に変換します。(読者の演習として残しておきます)。
  2. 次に、uchar.hを使用して各文字を調べます。
  3. 私たちのキャラクターがUBool u_isdigit (UChar32 c)
  4. 値はint32_t u_charDigitValue ( UChar32 c )

あるいは、ICU にそれを行う機能があるのか​​もしれませんが、詳しくは見ていません。

于 2009-05-15T13:44:38.957 に答える
2
#include<iostream>
#include<stdlib>
using namespace std;

void main()
{
     char ch;
     int x;
     cin >> ch;
     x = char (ar[1]);
     cout << x;
}
于 2009-02-01T16:51:00.197 に答える
1

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

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

于 2009-01-13T16:22:22.707 に答える
1

このようにして、char を int に、int を char に簡単に変換できます。

int charToInt(char c)
{
   int arr[]={0,1,2,3,4,5,6,7,8,9};
   return arr[c-'0'];
}
于 2017-01-03T16:51:54.057 に答える
1

@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 スタックの長年の開発者です。文字列クラスに、文字と文字列の間をスムーズに移行するためのものがもっとあることを望んでいましたが、ネイティブでサポートされているものはまだ見つかりません。

于 2021-07-26T16:13:17.900 に答える