c/c++ string 函数

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\n", 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\nworld\n你好\njianshan\n";
	char *parts[1024];//足够大
	size_t size = strsplit(str, parts, "\n");
	int i = 0;
	for (; i < size; ++i) {
		printf("%s\n", 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值