0

私は次のコードを実装しました。これは想定どおりの動作をしますが、単純化できる/すべきだと思います。

基本的に、testStringで見つかった数字の1つをそれぞれ含む数値のベクトルを作成する必要があります。charから直接stringstreamを構築する方法はありますか(つまり、testString [i])?C ++の方法で実行できるのであれば、atoiのようなCスタイルの関数は使用したくありません。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

int main ()
{
    std::string testString = "abc123.bla";
    std::string prefix = "abc";

    std::vector<unsigned short> digits;

    if (0 == testString.find(prefix))
    {
        for (size_t i = prefix.size(); i < testString.find("."); ++i)
        {
            int digit;
            std::stringstream digitStream;
            digitStream << testString[i];
            digitStream >> digit;
            digits.emplace_back(digit);
        }
    }

    for (std::vector<unsigned short>::iterator digit = digits.begin(); digit < digits.end(); ++digit)
    {
        std::cout << *digit << std::endl;
    }

    return 0;
}
4

2 に答える 2

1

私の元のコメントを参照してください; '0'各桁の文字から減算します。

#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cctype>
#include <functional>
#include <iostream>

...

std::string input = "abc123.bla";
std::string prefix = "abc";
std::vector<unsigned short> digits;

auto input_b = input.begin();
std::copy_if(input_b, std::find(input_b, input.end(), '.'),
    std::back_inserter(digits), (int (*)(int)) std::isdigit);

auto digits_b = digits.begin();
auto digits_e = digits.end();
std::transform(digits_b, digits_e, digits_b,
    std::bind2nd(std::minus<unsigned short>(), '0'));
std::copy(digits_b, digits_e,
    std::ostream_iterator<unsigned short>(std::cout, "\n"));

digits中間桁の値を含める必要がない場合は、短縮することもできます。

std::transform(digits.begin(), digits.end(),
    std::ostream_iterator<unsigned short>(std::cout, "\n"),
    std::bind2nd(std::minus<unsigned short>(), '0'));
于 2012-09-11T20:28:04.230 に答える
1

testString[i]との間'0'にあると仮定して'9'、次のようにします。

digits.emplace_back(testString[i] - '0');
于 2012-09-11T19:31:24.047 に答える