C++ 如何在vc++;?
我有一个字符串“stack+ovrflow*newyork”;我必须拆分这个堆栈,overflow,newyorkC++ 如何在vc++;?,c++,visual-c++,C++,Visual C++,我有一个字符串“stack+ovrflow*newyork”;我必须拆分这个堆栈,overflow,newyork 任何想法???您可以使用基于分隔符的字符串标记化。您可以使用基于分隔符的字符串标记化。首先,如果可用,我将始终使用boost::tokenizer执行此类任务(请参阅下面的精彩答案并进行投票) 如果无法访问boost,您有两种选择: 可以使用C++ STD::Stand,使用StrugStand和GETLIN(安全方式)解析它们 首先也是最重要的一点是,如果可以的话,我将始终使用b
任何想法???您可以使用基于分隔符的字符串标记化。您可以使用基于分隔符的字符串标记化。首先,如果可用,我将始终使用boost::tokenizer执行此类任务(请参阅下面的精彩答案并进行投票) 如果无法访问boost,您有两种选择:
可以使用C++ STD::Stand,使用StrugStand和GETLIN(安全方式)
解析它们首先也是最重要的一点是,如果可以的话,我将始终使用boost::tokenizer来完成这类任务(请参阅下面的重要答案并进行投票) 如果无法访问boost,您有两种选择:
可以使用C++ STD::Stand,使用StrugStand和GETLIN(安全方式)
解析它们请参阅boost tokenizer。请参阅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());
#包括
#包括
#包括
std::string stringToTokenize=“stack+ovrflow*newyork;”;
boost::字符分隔符sep(“+*;”);
boost::tokenizertok(StringToToToTokenize,sep);
std::向量向量,带有标记化字符串;
vectorWithTokenizedStrings.assign(tok.begin(),tok.end());
现在vectorWithTokenizedStrings具有您要查找的标记。请注意boost::char\u separator变量。它在令牌之间保留分隔符。
简单地说:
#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());
#包括
#包括
#包括
std::string stringToTokenize=“stack+ovrflow*newyork;”;
boost::字符分隔符sep(“+*;”);
boost::tokenizertok(StringToToToTokenize,sep);
std::向量向量,带有标记化字符串;
vectorWithTokenizedStrings.assign(tok.begin(),tok.end());
现在vectorWithTokenizedStrings具有您要查找的标记。请注意boost::char\u separator变量。它在标记之间保留分隔符。还有另一种使用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;
}
这种方法将更加高效和可重用还有另一种使用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*?您使用的是哪个字符串类?或者这是一个字符*?_tcstok和strtok之间有什么区别?它将根据是否在编译期间设置UNICODE编译器标志调用strtok或wcstok depnding。_tcstok和strtok之间有什么区别?它将根据是否在编译期间设置UNICODE编译器标志调用strtok或wcstok depnding。当使用strtok时,要注意它的单一性@xtofl注意STL的任何部分及其单个threadedness@DougT:如果我是正确的,
strtok
对任何线程使用相同的全局内存,而您可以选择在不同的线程中使用不同的string
对象。如果你不明白,你也完蛋了。@xtofl我不太清楚你在说什么。C或C++的标准库都没有线程安全…这两种语言本身都没有任何线程概念。但也许我没有完全理解你。@Doug T:strtok
是有状态的,而getline
使用参数对象的状态。我想象上述代码被包装成两个函数。带有stringstream
的函数使用局部变量,因此是线程安全的。strtok
版本,即使它似乎使用线程局部变量,也会导致争用条件,因为strtok
是有状态的。(cfr)使用strtok时,请注意它的单一性@xtofl注意STL的任何部分及其单个threadedness@DougT:如果我是正确的,strtok
对任何线程使用相同的全局内存,而您可以选择在不同的线程中使用不同的string
对象。如果你不明白,你也完蛋了。@xtofl我不太清楚你在说什么。C或C++的标准库都没有线程安全…这两种语言本身都没有任何线程概念。但也许我没有完全理解你。@Doug T:strtok
是有状态的,而getline
使用参数对象的状态。我想象上述代码被包装成两个函数。带有stringstream
的函数使用局部变量,因此是线程安全的。strtok
版本,即使它似乎使用线程局部变量,也会导致争用条件,因为strtok
是有状态的。(cfr)函数返回一个自然数(计数器),而不是实数。谢谢你的回答!函数返回一个自然数(计数器),而不是实数。谢谢你的回答!
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"