从url提取key vale

/*************************************************************************
    > File Name: test.h
    > Author: wangzhicheng
    > Mail: [email protected] 
    > Created Time: Fri 11 Aug 2017 09:30:45 PM AWST
 ************************************************************************/
#ifndef TEST_H
#define TEST_H
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <vector>
using namespace std;
void GetUrlKeyVal(const char *uri, vector<string>&keys, vector<string>&values);
#endif

/*************************************************************************
    > File Name: test.cpp
    > Author: wangzhicheng
    > Mail: [email protected] 
    > Created Time: Wed 02 Aug 2017 10:49:18 PM AWST
 ************************************************************************/
#include "test.h"
void GetUrlKeyVal(const char *uri, vector<string>&keys, vector<string>&values)
{
	const char *p = uri;
	while(*p)
	{
		if('?' == *p) break;
		p++;
	}
	if(0 == *p) return;
	char tmp[1024] = "";
	int loop = 0;
	bool Get = false;
	while(*p)
	{
		if(*(p + 1) && !Get)
		{
			sscanf(p + 1, "%[^= | &]", tmp);
			if(strcmp(tmp, ""))
			{
				Get = true;
				if(!loop) keys.emplace_back(tmp);
				else values.emplace_back(tmp);
			}
		}
		p++;
		if(0 == *p) break;
		if(('=' == *p) || ('&' == *p))
		{
			if('=' == *p) loop = 1;
			else loop = 0;
			Get = false;
		}
	}
}


/*************************************************************************
    > File Name: test_unittest.cpp
    > Author: wangzhicheng
    > Mail: [email protected] 
    > Created Time: Fri 11 Aug 2017 09:33:22 PM AWST
 ************************************************************************/

#include "test.h"
#include "gtest/gtest.h"
TEST(GETURLKEYVAL, NORMAL)
{
	const char *uri = "http://www.123.com/jk/lll?key0=val0&key1=val1&key2=val2&keyXX0=val_0090*";
	vector<string>keys;
	vector<string>values;
	GetUrlKeyVal(uri, keys, values);
	EXPECT_EQ("key0", keys[0]);
	EXPECT_EQ("key1", keys[1]);
	EXPECT_EQ("key2", keys[2]);
	EXPECT_EQ("keyXX0", keys[3]);
	EXPECT_EQ("val0", values[0]);
	EXPECT_EQ("val1", values[1]);
	EXPECT_EQ("val2", values[2]);
	EXPECT_EQ("val_0090*", values[3]);
}
TEST(GETURLKEYVAL, ABNORMAL0)
{
	const char *uri = "http://www.123.com/jk/lll?";
	vector<string>keys;
	vector<string>values;
	GetUrlKeyVal(uri, keys, values);
	EXPECT_EQ(0, keys.size());
	EXPECT_EQ(0, values.size());
}
TEST(GETURLKEYVAL, ABNORMAL1)
{
	const char *uri = "http://www.123.com/jk/lll?&";
	vector<string>keys;
	vector<string>values;
	GetUrlKeyVal(uri, keys, values);
	EXPECT_EQ(0, keys.size());
	EXPECT_EQ(0, values.size());
}
TEST(GETURLKEYVAL, ABNORMAL2)
{
	const char *uri = "http://www.123.com/jk/lll?kkkk&";
	vector<string>keys;
	vector<string>values;
	GetUrlKeyVal(uri, keys, values);
	EXPECT_EQ("kkkk", keys[0]);
	EXPECT_EQ(0, values.size());
}
TEST(GETURLKEYVAL, ABNORMAL3)
{
	const char *uri = "http://www.123.com/jk/lll?kkkk&key1=val1&";
	vector<string>keys;
	vector<string>values;
	GetUrlKeyVal(uri, keys, values);
	EXPECT_EQ("kkkk", keys[0]);
	EXPECT_EQ("key1", keys[1]);
	EXPECT_EQ("val1", values[0]);
}
TEST(GETURLKEYVAL, ABNORMAL4)
{
	const char *uri = "http://www.123.com/jk/lll?=kkkk&key1=val1&";
	vector<string>keys;
	vector<string>values;
	GetUrlKeyVal(uri, keys, values);
	EXPECT_EQ("key1", keys[0]);
	EXPECT_EQ("kkkk", values[0]);
	EXPECT_EQ("val1", values[1]);
}

# A sample Makefile for building Google Test and using it in user
# tests.  Please tweak it to suit your environment and project.  You
# may want to move it to your project's root directory.
#
# SYNOPSIS:
#
#   make [all]  - makes everything.
#   make TARGET - makes the given target.
#   make clean  - removes all files generated by make.

# Please tweak the following variable definitions as needed by your
# project, except GTEST_HEADERS, which you can use in your own targets
# but shouldn't modify.

# Points to the root of Google Test, relative to where this file is.
# Remember to tweak this if you move this file.
GTEST_DIR = /home/wangzhicheng/C++/gtest/googletest-master/googletest/

# Where to find user code.
USER_DIR = ./

# Flags passed to the preprocessor.
# Set Google Test's header directory as a system directory, such that
# the compiler doesn't generate warnings in Google Test headers.
CPPFLAGS += -isystem $(GTEST_DIR)/include

# Flags passed to the C++ compiler.
CXXFLAGS += -std=c++11 -g -Wall -Wextra -pthread

# All tests produced by this Makefile.  Remember to add new tests you
# created to the list.
TESTS = test_unittest

# All Google Test headers.  Usually you shouldn't change this
# definition.
GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
                $(GTEST_DIR)/include/gtest/internal/*.h

# House-keeping build targets.

all : $(TESTS)

clean :
	rm -f $(TESTS) gtest.a gtest_main.a *.o

# Builds gtest.a and gtest_main.a.

# Usually you shouldn't tweak such internal variables, indicated by a
# trailing _.
GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)

# For simplicity and to avoid depending on Google Test's
# implementation details, the dependencies specified below are
# conservative and not optimized.  This is fine as Google Test
# compiles fast and for ordinary users its source rarely changes.
gtest-all.o : $(GTEST_SRCS_)
	$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
            $(GTEST_DIR)/src/gtest-all.cc

gtest_main.o : $(GTEST_SRCS_)
	$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
            $(GTEST_DIR)/src/gtest_main.cc

gtest.a : gtest-all.o
	$(AR) $(ARFLAGS) $@ $^

gtest_main.a : gtest-all.o gtest_main.o
	$(AR) $(ARFLAGS) $@ $^

# Builds a sample test.  A test should link with either gtest.a or
# gtest_main.a, depending on whether it defines its own main()
# function.

test.o : $(USER_DIR)/test.cpp $(USER_DIR)/test.h $(GTEST_HEADERS)
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/test.cpp

test_unittest.o : $(USER_DIR)/test_unittest.cpp \
                     $(USER_DIR)/test.h $(GTEST_HEADERS)
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/test_unittest.cpp

test_unittest : test.o test_unittest.o gtest_main.a
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@

猜你喜欢

转载自blog.csdn.net/wangzhicheng2013/article/details/77104059