我有这一行:
const char *S1 = "AaA BbB CcC DdD AaA";
我认为这会创建一个指针*S1
,它指向一个常量的char类型值并且其中包含AaA BbB CcC DdD AaA
值。是对的吗?
如果是这样,我如何读取此常量值的每个字符并识别AaA
出现的次数?
我正在考虑创建一个循环,将每个字母复制到另一个单元格,然后是3个附带的if
语句,其中第一个可以检查A
,第二个可以检查a
一个人。如果这3个为真,我会增加一个像i++
这样的计数器。那是对的吗?
我认为这太复杂了,可以用更少的代码来完成。
答案 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}}