c/c++string関数

4134 ワード

std::vector<std::string> inline StringSplit(const std::string &source, const char *delimiter = " ", bool keepEmpty = false)
{
	std::vector<std::string> results;
	size_t prev = 0;
	size_t next = 0;

	while ((next = source.find_first_of(delimiter, prev)) != std::string::npos)
	{
		if (keepEmpty || (next - prev != 0))
		{
			results.push_back(source.substr(prev, next - prev));
		}
		prev = next + 1;
	}
	if (prev < source.size())
	{
		results.push_back(source.substr(prev));
	}
	return results;
}
std::vector<std::string> split(char* source, const char *delimiter = " ")
{
	std::vector<std::string> results;
	char *p = strtok(source, delimiter);
	while (p) {

		DebugA ("Token: %s
", p); results.push_back(p); p = strtok(NULL,delimiter); } return results; } #include <iostream> #include <sstream> void split2(char* source) { string tmps; istringstream is (source); while (is.good ()) { is >> tmps; DebugA(tmps.c_str()); } }
int  split(char* source, const char *delimiter,char* result[],int *len)
{
	char *p = strtok(source, delimiter);
	int count=0;
	while (p) {
		//printf("Token: %s", p);
		strcpy(result[count],p);
		count++;
		p = strtok(NULL,delimiter);
	}
	*len=count;
	return 0;
}

呼び出し方法:
	char source[]="8001,d11de39759f0b736d1fcd1965b3f3ef6ee520f99";

	char* split_result[256];
	int split_len=0,split_i=0,i=0;
	for(split_i=0; split_i<256; split_i++)
	{
		split_result[split_i] = (char *)malloc(sizeof(char) * 256);
		memset(split_result[split_i],0,sizeof(split_result[split_i]));
	}	
	split(source,",",split_result,&split_len);

	for (i=0;i<split_len;i++)
	{
		OutputDebugStringA(split_result[i]);
	}

string拡張クラスを添付
http://www.partow.net/programming/strtk/
http://www.partow.net/downloads/strtk.zip
https://github.com/imageworks/pystring
https://github.com/ptjohns2/jstring
https://github.com/billpcs/CStringExtrasLibrary
https://github.com/GeromeSchutte/stdString-Tools
https://github.com/built/PerlString
https://github.com/wzyplus/StringBuffer
https://github.com/jwerle/strsplit.c
c/c++は文字列処理で他の言語java pythonに及ばず、上の拡張が役立ちます.
行による文字列の読み込み:
stringstream strstream;//#include <sstream>
		strstream<<string(tmp);
		vector<string> lines;
		char buffer[1024];	
		deviceNames.clear();
		while (strstream.getline(buffer,sizeof(buffer)))//c++       
		{
			//DebugA(buffer);
			string delimiter="	";
			pystring::split(string(buffer), lines, delimiter,delimiter.size());
			if(lines.size()>=2)
			{
				if(lines.at(1).compare("device")==0)
				{

					deviceNames.push_back(lines.at(0));
					DebugA(lines.at(0).c_str());
				}
			}

		}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <assert.h>

//https://github.com/jwerle/strsplit.c
int strsplit (const char *str, char *parts[], const char *delimiter) {
		char *pch;
		int i = 0;
		char *tmp = strdup(str);
		pch = strtok(tmp, delimiter);

		parts[i++] = strdup(pch);

		while (pch) {
			pch = strtok(NULL, delimiter);
			if (NULL == pch) break;
			parts[i++] = strdup(pch);
		}

		free(tmp);
		free(pch);
		return i;
}

void demo001()
{

	char str[] = "hello
world

jianshan
"; char *parts[1024];// size_t size = strsplit(str, parts, "
"); int i = 0; for (; i < size; ++i) { printf("%s
", parts[i]); } } void demo002() { char str[] = "0abc1abc2abc3abc4abc5abc6abc7abc8abc9"; char **parts = (char**)calloc(10, sizeof(char *)); assert(parts); size_t size = strsplit(str, parts, "abc"); assert(size); int i = 0; for (; i < (int) size; ++i) { assert(i == atoi(parts[i])); printf("%d ",atoi(parts[i])); } } int main( int argc, char* argv[] ) { demo001(); demo002(); getch(); return 0; }