map2str和str2map

舉個例子:
http://www.test.cn:8080/max/123.html?name=kevinchuang&pwd=123456#first
通常http鏈接部分都是固定,我們需要關心的是從“?”到“#”部分的數據部分。
比如現在我們要構造一個GET請求:

string url = "http://www.test.cn:8080/max/123.html";
url += "?";
map<string, string> data;
data["name"] = "kevinchuang";
data["pwd"] = "123456";
map2str(url, data);

這裏我們看一下構造接口:

#define FIELD_FLAG     "&"    
#define VALUE_FLAG     "=" 
typedef map<string, string> Data;
void map2str(string &url, const Data &data)
{
    for(Data::iterator it = data.begin(); it != data.end(); it++)
    {
	url += it->first.c_str();
	url += VALUE_FLAG;
	url += it->second.c_str();	
	url += FIELD_FLAG;
    }

    if(url.size())
    {
	string tmp(url.c_str(), url.size()-1);
	url = tmp;
    }
}

現在假如我們收到了key=value格式的buf數據,怎麼方便使用了?

void str2map(string &buf, Data &data)
{
    string bvalue, fname, fvalue;

    string stbuf = buf;
    while(get_field(stbuf, bvalue))
    {
	if(!get_value(bvalue, fname, fvalue))
	{
		continue;
	}
	data[fname]=fvalue; 
    }
}

int get_field(string &str, string &value)
{   
    if(str.size() ==0)
    {	
        return 0;
    }

    string::size_type start = str.find(FIELD_FLAG);
    if(start == string::npos || start !=0)
    {
        start= 0;
    }
    else
    {
	start += strlen(FIELD_FLAG);
    }

    string::size_type end = str.find(FIELD_FLAG, start);
    if(end == string::npos)
    {
       	end = str.size();
    }

    value = str.substr(start, end - start);
    str = str.substr(end);

    return 1;
}

int get_value(const string &str, string &name, string &value)
{
    string::size_type pos = str.find(VALUE_FLAG);
    if(pos == string::npos)
    {
        return 0;
    }

    name = str.substr(0, pos);
    value = str.substr(pos + strlen(VALUE_FLAG));

    return 1;
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章