3

私はC++の初心者であり、これを理解することはできません。質問が言うように、(数値の)文字列がある場合、各桁を整数に変換して、それぞれを整数の配列に入れるにはどうすればよいですか?

これが私の試みでした:

std::string stringNumber = "123456789"; // this number will be very large

int intNumber[stringNumber.length()];

for (int i = 0; i < stringNumber.length(); i++) 
{
    intNumber[i] = std::atoi(stringNumber[i]);
    std::cout << intNumber[i] << std::endl;
}
4

2 に答える 2

9

ほとんどが事前に構築されたソリューションの場合、ベクトルとを使用しstd::transformます。アイデアは、各文字を調べて、その整数形式をベクトルに追加することです:(完全なサンプルを参照

std::string s = "1357924680";
std::vector<int> ints;
ints.reserve(s.size()); //to save on memory reallocations, thanks Nawaz
std::transform(std::begin(s), std::end(s), std::back_inserter(ints),
    [](char c) {
        return c - '0';
    }
);

これは、文字列の最初から最後までループし、各文字を取得し、その値からマイナス'0''5' - '0'5)をベクトルの最後に加算して、同等の整数のベクトルを残します。何よりも、それは車輪の再発明ではありません!

また、次の2つの問題も解決します。

  1. std::vector可変長配列(VLA)の代わりに使用します。後者は非標準であるため、ランタイムサイズの配列が必要な場合はベクトルをお勧めします。

  2. を使用するatoiと、エラーが発生すると0が返され、結果が0であるか、エラーが発生したかがわからないため、それ自体は不良です。また、単一の文字ではなく、文字列を取ります。代わりに、これはとの間の距離を見つけ'0'ます。これは必要な整数です。

セキュリティを強化するためisdigitに、文字が数字であるかどうかを確認するために使用できます。そうでない場合は、何らかのエラー(例外など)を発生させるか、それ以外の方法で対処します。これにより、intsベクトルの数字が0から9になり、たとえば25の数字になることはありません。

于 2012-12-22T20:42:22.423 に答える
6

atoi()は必要ありません。使用するintNumber[i] = stringNumber[i] - '0';

于 2012-12-22T20:38:45.613 に答える