C++ 子字符串和分隔符

C++ 子字符串和分隔符,c++,string,substring,delimiter,C++,String,Substring,Delimiter,我试图得到一个由某些字符(空格、逗号或点)分隔的句子,以检查它是否是回文。如果输入是“你好,土豆”,我将单独检查“你好”,然后单独检查土豆的对称性 问题是,当我执行搜索分隔符的循环的第一次迭代时,单词“hello”存储在子句子中,但是在第二次迭代中,应该存储为“potato”的单词将是“potato”。我无法从输入字符串的末尾删除“.”分隔符 for(int i=0;i<sentence.length();i++) { if(sentence[i]==' '||

我试图得到一个由某些字符(空格、逗号或点)分隔的句子,以检查它是否是回文。如果输入是“你好,土豆”,我将单独检查“你好”,然后单独检查土豆的对称性

问题是,当我执行搜索分隔符的循环的第一次迭代时,单词“hello”存储在子句子中,但是在第二次迭代中,应该存储为“potato”的单词将是“potato”。我无法从输入字符串的末尾删除“.”分隔符

for(int i=0;i<sentence.length();i++)
      {
        if(sentence[i]==' '||sentence[i]=='.'||sentence[i]==',')
        { //the couts is just to help me debug/trace
                cout<<"i is now : "<<i<<endl;
                if(i==delindex && i==sentence.length()-1)
                {
                 subsentence=sentence.substr(temp+1,subsentence.length()-1);
                }
                else
                {
                    subsentence=sentence.substr(delindex,i);
                    cout<<subsentence<<endl;
                    temp=delindex-1;
                    delindex=i+1;
                }
        }
      }
for(int i=0;i
上帝保佑你,斯特克是我一直在寻找的

实际上,您不需要strtok(出于各种安全原因,可能应该避免使用strtok),正如
std::string
有一个很棒的方法,叫做
strtok
,它的行为非常类似于
strtok
,因为它接受一堆字符,当它偶然发现任何字符时返回索引。然而,要使健壮的标记器成为
的find\u first\u of
的组合,更适合这种情况

因此,您可以将令牌搜索简化为:

#include <iostream> 
#include <string>

int main()
{
    std::string sentence = "hello,potato tomato.";
    std::string delims = " .,";

    size_t beg, pos = 0;
    while ((beg = sentence.find_first_not_of(delims, pos)) != std::string::npos)
    {
        pos = sentence.find_first_of(delims, beg + 1);
        std::cout << sentence.substr(beg, pos - beg) << std::endl;
    }
}
#包括
#包括
int main()
{
std::string语句=“你好,土豆西红柿。”;
std::string delims=“,”;
尺寸,位置=0;
while((beg=句子。首先查找(delims,pos)中的非)!=std::string::npos)
{
pos=句子。首先查找(delims,beg+1);
标准::cout
上帝保佑你,斯特克是我一直在寻找的

实际上,您不需要strtok(出于各种安全原因,可能应该避免使用strtok),正如
std::string
有一个很棒的方法,叫做
strtok
,它的行为非常类似于
strtok
,因为它接受一堆字符,当它偶然发现任何字符时返回索引。然而,要使健壮的标记器成为
的find\u first\u of
的组合,更适合这种情况

因此,您可以将令牌搜索简化为:

#include <iostream> 
#include <string>

int main()
{
    std::string sentence = "hello,potato tomato.";
    std::string delims = " .,";

    size_t beg, pos = 0;
    while ((beg = sentence.find_first_not_of(delims, pos)) != std::string::npos)
    {
        pos = sentence.find_first_of(delims, beg + 1);
        std::cout << sentence.substr(beg, pos - beg) << std::endl;
    }
}
#包括
#包括
int main()
{
std::string语句=“你好,土豆西红柿。”;
std::string delims=“,”;
尺寸,位置=0;
while((beg=句子。首先查找(delims,pos)中的非)!=std::string::npos)
{
pos=句子。首先查找(delims,beg+1);

std::cout@JCollier它的bocmes就像土豆一样。在末尾有一个点(分隔符),我希望没有点,但是有一种非常简单的方法可以使用
.begin()
.rbegin()
要推断回文,对多个分隔符的解析仍然最好由
提供。虽然
getline
允许使用结尾分隔符,但它不允许使用多个分隔符。@DavidC.Rankin上帝保佑你,strok是我一直在寻找的东西。它是自切片面包以来用于标记stri的最伟大的东西ng(在
标题中可以找到许多在C++中没有直接类对应项的金块)@JCollier它的bocmes就像土豆一样。在末尾有一个点(分隔符),我希望没有点,而使用
.begin()
.rbegin()有一个非常简单的方法
要推断回文,对多个分隔符的解析仍然最好由
提供。虽然
getline
允许使用结尾分隔符,但它不允许使用多个分隔符。@DavidC.Rankin上帝保佑你,strok是我一直在寻找的东西。它是自切片面包以来用于标记stri的最伟大的东西ng(在
标题中可以找到许多在C++中没有直接对应类的金块)