$GPGGA,071855.6,3509.4505,N,13847.6955,E,1,4,2.35,,M,,M,,*69
この様な文字列があったときに、,から,間に5文字以上文字がある時のみ
抽出して表示するには、どうしたらよいかご教授お願いできますでしょうか?初心者なもので、すいません。
単純に考えると、strtokで切り出して、strlenでチェックするとか。
ただし全角文字が入ってきたときは工夫が要りますが。
std::string::findあたりをループで回して、
前のインデクスとの差分で五文字以上あるかを見る、とか。
全角は、文字数で見るならwstringにするのがお手軽かと。
関数一発で何とかなるとかいうレベルの問題ではないので
地道にプログラムを組むしかありません。
で、プログラムを組むのに必要と思われる関数や
基本的な考え方は既にBlueさんとBanさんが書いておられるので
それを参考に考えてみると良いと思います。
基本的にはメンドクサイだけで難しい問題ではないので
地道に考えて見てはどうでしょうか。
全くロジックが思いつかないというのであれば、
もっと簡単な例から勉強される事をお勧めします。
どうも、簡単に考えすぎていたみたいなのでもう一度、地道に一から考え直してみます。お三方ありがとうございました
boost使って良いなら
#include <algorithm>
#include <iostream>
#include <string>
#include <boost/function.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/if.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/tokenizer.hpp>
int main() {
using namespace boost::lambda;
std::string str = "$GPGGA,071855.6,3509.4505,N,13847.6955,E,1,4,2.35,,M,,M,,*69";
boost::tokenizer<boost::char_separator<char> > tok(str, boost::char_separator<char>(","));
std::for_each(tok.begin(), tok.end(), if_(bind(&std::string::length, _1) >= 5)[ std::cout << _1 << '\n' ]);
}
> boost使って良いなら
私ならば、正規表現かな。
#include <iostream>
#include <locale>
#include <boost/regex.hpp>
struct grep_predicate
{
bool operator() ( const boost::match_results< std::wstring::const_iterator >& m )
{
std::wcout << m.str(0) << std::endl;
return true;
}
};
int main()
{
std::locale::global( std::locale( "japanese" ) );
const std::wstring source = L"$GPGGA,071855.6,3509.4505,N,13847.6955,E,1,4,2.35,,M,,M,,*69";
boost::reg_expression< wchar_t > regex( L"[^\\,]{5}[^\\,]*" );
boost::regex_grep( grep_predicate(), source.begin(), source.end(), regex );
return 0;
}
あっ、そういう方法でもあるんだ
いい勉強になりました。
ツイート | ![]() |