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;
}