2009-06-25 57 views
1

我有一个字符串“stack + ovrflow * newyork;”我必须分裂这堆,溢出,纽约如何在vC++中分割字符串?

任何想法??

+0

这串类您使用的?或者这是一个char *? – Salgar 2009-06-25 14:00:23

回答

10

首先如果有的话,我会一直使用boost ::标记生成器对于这样的任务(见并给予好评下方伟大的答案)

如果得不到提高,你有两个选择:

您可以使用C++的std ::字符串,并使用stringstream的和函数getline(最安全的方法)

std::string str = "stack+overflow*newyork;"; 
std::istringstream stream(str); 
std::string tok1; 
std::string tok2; 
std::string tok3; 

std::getline(stream, tok1, '+'); 
std::getline(stream, tok2, '*'); 
std::getline(stream, tok3, ';'); 

std::cout << tok1 << "," << tok2 << "," << tok3 << std::endl 

解析他们或者你可以使用的strtok家庭的功能(参见纳文对Unicode的不可知版本的答案之一;请参阅下面的xtofls注释以获得警告关于线程安全英格斯),如果你是舒服字符指针

char str[30]; 
strncpy(str, "stack+overflow*newyork;", 30); 

// point to the delimeters 
char* result1 = strtok(str, "+"); 
char* result2 = strtok(str, "*"); 
char* result3 = strtok(str, ";"); 

// replace these with commas 
if (result1 != NULL) 
{ 
    *result1 = ','; 
} 
if (result2 != NULL) 
{ 
    *result2 = ','; 
} 

// output the result 
printf(str); 
+0

getline和strtok方法的不错比较 – 2009-06-25 14:19:36

+0

使用strtok时,要小心它的单一性! – xtofl 2009-06-25 14:40:00

2

您可以使用_tcstok根据分隔符对字符串进行标记。

+0

_tcstok和strtok有什么区别? – 2009-06-25 14:02:13

+2

它将调用strtok或wcstok在编译期间是否设置UNICODE编译器标志。 – Naveen 2009-06-25 14:04:41

4

见升压标记生成器here

5

Boost tokenizer

简单的是这样的:

#include <boost/tokenizer.hpp> 
#include <vector> 
#include <string> 
std::string stringToTokenize= "stack+ovrflow*newyork;"; 
boost::char_separator<char> sep("+*;"); 
boost::tokenizer< boost::char_separator<char> > tok(stringToTokenize, sep); 
std::vector<std::string> vectorWithTokenizedStrings; 
vectorWithTokenizedStrings.assign(tok.begin(), tok.end()); 

现在vectorWithTokenizedStrings有你要找的令牌。注意boost :: char_separator变量。它拥有令牌之间的分隔符。

1

还有另一种方法使用分割字符串C/C++:

首先定义一个函数来分割字符串:

//pointers of the substrings, assume the number of fields will not be over 5 
char *fields[5]; 
//str: the string to splitted 
//splitter: the split charactor 
//return the real number of fields or 0 if any error exits 
int split(char* str, char *splitter) 
{ 
    if(NULL == str) 
    { 
     return 0; 
    } 

    int cnt; 
    fields[0] = str; 
    for(cnt = 1; (fields[cnt] = strstr(fields[cnt - 1], splitter)) != NULL && 
      cnt < 5; cnt++) 
    { 
     *fields[cnt] = '\0'; 
     ++fields[cnt]; 
    } 
    return cnt; 
} 

,那么你可以使用此功能来分割字符串如下:

char* str = "stack+ovrflow*newyork;" 
split(str, "+"); 
printf("%s\n", fields[0]); //print "stack" 
split(fields[1], "*"); 
printf("%s\n", fields[0]); //print "ovrflow" 
split(fields[1], ";"); 
printf("%s\n", fields[0]); //print "newyork" 

这样将更有效率和可重复使用的