【问题标题】:Sub-strings and delimiters子字符串和分隔符
【发布时间】:2018-03-05 21:26:15
【问题描述】:

我正在尝试获取由某些字符(空格、逗号或点)分隔的句子,以检查它是否是回文。如果输入是“hello,p​​otato.”,我将只检查“hello”的对称性,然后只检查土豆。

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

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;
                }
        }
      }

最好的方法是什么?

【问题讨论】:

  • @JCollier 像马铃薯一样。最后有一个点(分隔符)我想要没有点
  • 虽然有一种非常简单的方法可以使用.begin().rbegin() 来推断回文,但解析多个分隔符仍然最好由strtok 处理,由&lt;cstring&gt; 提供。 getline 允许使用结束分隔符,但不允许使用多个分隔符。
  • @DavidC.Rankin 上帝保佑你,我一直在寻找 strtok
  • 这是自切片面包以来最伟大的事情,用于标记字符串(在 &lt;cstring&gt; 标头中可以找到许多在 C++ 中没有直接对应类的块)跨度>

标签: c++ string substring delimiter


【解决方案1】:

上帝保佑你,我一直在寻找 strtok

实际上,您不需要strtok(出于各种安全原因可能应该避免使用它),因为std::string 有一个名为find_first_of 的绝妙方法,它的作用非常类似于strtok,因为它接受一堆字符并在偶然发现任何字符时返回索引。然而,在这种情况下,find_first_offind_first_not_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;
    }
}

https://ideone.com/rhMyvG

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    相关资源
    最近更新 更多