スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Tag:スポンサー広告 

【C++】ApacheAPIから取得できるQUERY_STRINGのような文字列の分解

ApacheAPIを使い取得することができるQUERY_STRING

b=3&a=2&test=hoge&test2=hogehoge

こんな感じの文字列です。

余談ですが

query = apr_table_get(r->subprocess_env, "QUERY_STRING");

というApacheAPIで取得します。

これを分解して欲しいリクエストパラメータの値を取得するためのクラスを簡単に書いてみました。

いきなりApacheモジュールで使うのではなく上記のような文字列を分解してみるくらいの楽な感じでかきました。


#include<iostream>
#include<string>
#include<map>
using namespace std;

class Params{
    map<string, string> params;
    string original_str;
    void insertMap(string str);
    void cutParams();
  public:
    Params(string str){
        this->original_str = str;
        this->cutParams();
    }   

    string getParam(string key);
};

void Params::insertMap(string str){
    string key;
    string value;
    int eql_idx;

    eql_idx = str.find('=', 0);
    if(eql_idx != string::npos){
        key.assign(str, 0, eql_idx);
        value.assign(str, eql_idx + 1, str.length() - eql_idx);
        this->params.insert(pair<string, string>(key, value));
    }  
}

void Params::cutParams(){
    string str = this->original_str;
    string token;
    int amp_idx = 0;
    int next_amp;

    while(1){
        next_amp = str.find('&', amp_idx);
        if(next_amp != string::npos){
            token.assign(str, amp_idx, next_amp - amp_idx);
            this->insertMap(token);
        }else{
            token.assign(str, amp_idx, str.length() - amp_idx);
            this->insertMap(token);
            break;
        }  
        amp_idx = next_amp + 1;
    }  
}

string Params::getParam(string str){
    map<string, string>::iterator p;

    p = this->params.find(str);

    if(p != this->params.end()){
        return p->second;
    }else{
        return "\0";
    }  
}

int main(void){
    Params p("b=3&a=2&test=hoge&test2=hogehoge");

    cout << p.getParam("test") << endl;
  
    return 0;
}


以前Cでも似たようなことを書いたことがありますが、C++で書く大きな利点は

1.stringやmapなどSTLが使える
2.STLに限らずBoostなど有用なライブラリが使える

ですね。
スポンサーサイト

Tag:C/C++  Trackback:0 comment:0 

Comment

comment form
(編集・削除用):
管理者にだけ表示を許可
プロフィール

6rats

Author:6rats
こんにちは、ITベンチャーで働くエンジニアです
主に自分の周りで起きた技術的なことをメモとして書き残して行きます。
Android以外にもRuby/Ruby on RailsやFuelPHPなどなどたまにやります。基本的なスタンスとしては興味があるもしくは必要になったらいろんなことにチャレンジします。
最近はiOSアプリ開発を始めています。

購読
follow us in feedly
個人プロダクト

Androidアプリ

Twitterクライアント

Webアプリケーション

EcPriceWatch(Amazon価格の推移を計測、最安値を知らせるサービス)
Google AdSense
ブログ村
にほんブログ村 IT技術ブログへ
にほんブログ村
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。