是否有更好的方法来计算字符串中的子字符串出现次数而不是char *和循环?

时间:2014-09-17 13:50:35

标签: c++ string substring

我有这一行:

const char *S1 = "AaA BbB CcC DdD AaA";

我认为这会创建一个指针*S1,它指向一个常量的char类型值并且其中包含AaA BbB CcC DdD AaA值。是对的吗?

如果是这样,我如何读取此常量值的每个字符并识别AaA出现的次数?

我正在考虑创建一个循环,将每个字母复制到另一个单元格,然后是3个附带的if语句,其中第一个可以检查A,第二个可以检查a一个人。如果这3个为真,我会增加一个像i++这样的计数器。那是对的吗?

我认为这太复杂了,可以用更少的代码来完成。

3 个答案:

答案 0 :(得分:1)

你的基本方法是合理的。但是,它很复杂且无法扩展:如果您想搜索超过三个字母的单词,该怎么办?四个if s?五if个?六......?显然不会这样做。

相反,使用两个循环:一个遍历您在中搜索的字符串(“haystack”或“reference”),另一个遍在您搜索 的字符串上(“针”或“图案”)。

但幸运的是你甚至不必这样做,因为C ++为你提供了在另一个字符串中搜索一个字符串的工具find函数:

#include <string>
#include <iostream>

int main() {
    std::string const reference = "AaA BbB CcC DdD AaA";
    std::string const pattern = "AaA";

    std::string::size_type previous = 0;
    int occurrences = 0;
    for (;;) {
        auto position = reference.find(pattern, previous);
        if (position == std::string::npos)
            break;
        previous = position + 1;
        ++occurrences;
    }

    std::cout << occurrences << " occurrences of " << pattern << '\n';
}

您可以在C++ reference中查找各种类型和功能。例如,您可以在那里找到the std::string::find function,它可以实际搜索我们。

请注意,这将找到嵌套模式:引用“AaAaA”将包含两次“AaA”。如果这不是您想要的,请更改重新分配previous位置的行。

答案 1 :(得分:0)

实现目标的简单方法是使用strstr(str1, str2)函数which returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.

int count_sequence(const char *S1, const char *sequence) {
    int times, sequence_len;
    const char *ptr;

    times = 0;
    sequence_len = strlen(sequence);
    ptr = strstr(S1, sequence); //Search for the first sequence
    while(ptr != NULL) {
        times++;
        ptr = strstr(ptr + sequence_len, sequence); //search from the last position
    }
    return times;
}

答案 2 :(得分:0)

C ++方式:

  • 使用std::string进行字符串管理,它提供了很多好处,内存管理,迭代器,一些算法,如find
  • 使用std::string s1方法搜索s2开始s2的索引,如果s1中不存在#include <iostream> int main() { std::string s1("AaAaAaA"); //std::string s1("AaA BbB CcC DdD AaA"); std::string s2("AaA"); int times = 0; size_t index = s1.find(s2, index); while (index != std::string::npos) { times++; index = s1.find(s2, index + 1); } std::cout << "Found '" << s2 << "' in '" << s1 << "' " << times << " times" << std::endl; } (返回虚拟值 std :: string :: npos 。)

代码:

{{1}}