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