Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在vc++;?_C++_Visual C++ - Fatal编程技术网

C++ 如何在vc++;?

C++ 如何在vc++;?,c++,visual-c++,C++,Visual C++,我有一个字符串“stack+ovrflow*newyork”;我必须拆分这个堆栈,overflow,newyork 任何想法???您可以使用基于分隔符的字符串标记化。您可以使用基于分隔符的字符串标记化。首先,如果可用,我将始终使用boost::tokenizer执行此类任务(请参阅下面的精彩答案并进行投票) 如果无法访问boost,您有两种选择: 可以使用C++ STD::Stand,使用StrugStand和GETLIN(安全方式)解析它们 首先也是最重要的一点是,如果可以的话,我将始终使用b

我有一个字符串“stack+ovrflow*newyork”;我必须拆分这个堆栈,overflow,newyork


任何想法???

您可以使用基于分隔符的字符串标记化。

您可以使用基于分隔符的字符串标记化。

首先,如果可用,我将始终使用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"