特定の文字を探し出すには

解決


秀麻呂  2006-08-10 22:24:56  No: 62699

$GPGGA,071855.6,3509.4505,N,13847.6955,E,1,4,2.35,,M,,M,,*69
この様な文字列があったときに、,から,間に5文字以上文字がある時のみ
抽出して表示するには、どうしたらよいかご教授お願いできますでしょうか?初心者なもので、すいません。


Blue  2006-08-10 22:30:47  No: 62700

単純に考えると、strtokで切り出して、strlenでチェックするとか。
ただし全角文字が入ってきたときは工夫が要りますが。


Ban  2006-08-10 22:37:40  No: 62701

std::string::findあたりをループで回して、
前のインデクスとの差分で五文字以上あるかを見る、とか。
全角は、文字数で見るならwstringにするのがお手軽かと。


PATIO  2006-08-11 21:01:44  No: 62702

関数一発で何とかなるとかいうレベルの問題ではないので
地道にプログラムを組むしかありません。
で、プログラムを組むのに必要と思われる関数や
基本的な考え方は既にBlueさんとBanさんが書いておられるので
それを参考に考えてみると良いと思います。
基本的にはメンドクサイだけで難しい問題ではないので
地道に考えて見てはどうでしょうか。
全くロジックが思いつかないというのであれば、
もっと簡単な例から勉強される事をお勧めします。


秀麻呂  2006-08-12 06:54:05  No: 62703

どうも、簡単に考えすぎていたみたいなのでもう一度、地道に一から考え直してみます。お三方ありがとうございました


通りすがりX  2006-08-12 22:00:58  No: 62704

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' ]);
}


Blue  2006-08-13 00:40:47  No: 62705

> 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;
}


清原  2006-08-13 05:38:43  No: 62706

あっ、そういう方法でもあるんだ
いい勉強になりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加