2009-06-25 58 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" 

這樣將更有效率和可重複使用的