[c++]string怎样判断字符串里面是否含有某个字符串?

本文介绍了在C++和C语言中如何查找一个字符串是否包含另一个字符串的方法。C++使用string类的find方法,而C语言则利用strstr函数实现相似功能。两者在实际应用中效率相近,但C++的实现更为简洁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘自百度知道:https://zhidao.baidu.com/question/438950092.html

一、C++风格。

C++的string类提供了字符串中查找另一个字符串的函数find。

其重载形式为:

string::size_type string::find(string &);

功能为在string对象中,查找参数string类型的字符串是否存在,如果存在,返回起始位置。不存在则返回 string::npos。

参考代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
using  namespace  std;
int  main()
{
     string a= "abcdefghigklmn" ;
     string b= "def" ;
     string c= "123" ;
     string::size_type idx;
     
     idx=a.find(b); //在a中查找b.
     if (idx == string::npos ) //不存在。
         cout <<  "not found\n" ;
     else //存在。
         cout << "found\n"
     idx=a.find(c); //在a中查找c。
     if (idx == string::npos ) //不存在。
         cout <<  "not found\n" ;
     else //存在。
         cout << "found\n"
     return  0;
}

二、C语言风格。

在C语言中,字符串存储为字符数组,以'\0'结束。 在C的接口中,有strstr函数,可以在字符串中查找另一个字符串。

char * strstr(const char *str1, const char *str2);

功能为在str1中查找str2,如果存在,那么返回查找到的起始指针,否则返回NULL。

参考代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <cstring>
using  namespace  std;
int  main()
{
     string a= "abcdefghigklmn" ;
     char  *b= "def" ;
     char  *c= "123" ;
     
     if ( strstr (a.c_str(), b) == NULL) //在a中查找b,如果不存在,
         cout <<  "not found\n" ; //输出结果。
     else //否则存在。
         cout << "found\n" //输出结果。
     if ( strstr (a.c_str(), c) == NULL) //在a中查找b,如果不存在,
         cout <<  "not found\n" ; //输出结果。
     else //否则存在。
         cout << "found\n" //输出结果。
     return  0;
}

三、注意事项。

两种方法在实际编程中都可以使用,效率几乎相同。不过相对来说使用C++的string效率更高一些,代码也更简便。

C++ 中,可以通过多种方法来判断一个 `std::string` 是否包含另一个子字符串。以下是几种常见的实现方式: ### 方法一:使用 `find()` 函数 标准库中的 `std::string` 提供了一个名为 `find()` 的成员函数,它可以用来查找子字符串的位置。如果找到,则返回其起始位置;如果没有找到,则返回 `std::string::npos`。 ```cpp #include <iostream> #include <string> bool containsSubstring(const std::string& str, const std::string& subStr) { return str.find(subStr) != std::string::npos; } int main() { std::string str = "Hello, world!"; std::string subStr = "world"; if (containsSubstring(str, subStr)) { std::cout << "The string contains the substring." << std::endl; } else { std::cout << "The string does not contain the substring." << std::endl; } } ``` 这种方法利用了标准库的功能,简洁高效[^1]。 --- ### 方法二:手动遍历匹配 如果不希望依赖于 `find()` 函数,也可以通过手动遍历来实现这一功能。这种方式虽然更复杂,但在某些特定场景下可能更有意义。 ```cpp #include <iostream> #include <string> bool containsSubstringManual(const std::string& str, const std::string& subStr) { if (subStr.empty()) return true; // 空字符串总是被包含 if (subStr.size() > str.size()) return false; for (size_t i = 0; i <= str.size() - subStr.size(); ++i) { if (str.substr(i, subStr.size()) == subStr) { return true; } } return false; } int main() { std::string str = "Hello, world!"; std::string subStr = "world"; if (containsSubstringManual(str, subStr)) { std::cout << "The string contains the substring manually checked." << std::endl; } else { std::cout << "The string does not contain the substring manually checked." << std::endl; } } ``` 此方法的核心在于逐一遍历主字符串并截取长度等于子字符串的部分进行比较[^2]。 --- ### 方法三:正则表达式(Regex) 对于更加复杂的模式匹配需求,可以考虑使用 `<regex>` 库来进行操作。尽管效率较低,但它支持强大的模式匹配能力。 ```cpp #include <iostream> #include <string> #include <regex> bool containsSubstringWithRegex(const std::string& str, const std::string& subStr) { std::regex pattern(subStr); return std::regex_search(str, pattern); } int main() { std::string str = "Hello, world!"; std::string subStr = "world"; if (containsSubstringWithRegex(str, subStr)) { std::cout << "The string contains the substring using regex." << std::endl; } else { std::cout << "The string does not contain the substring using regex." << std::endl; } } ``` 该方法适用于需要处理通配符或其他高级匹配的情况[^3]。 --- ### 性能对比 - **`find()`**: 高效且易于理解,推荐作为首选方案。 - **手动遍历**: 更加灵活,适合学习或特殊用途。 - **正则表达式**: 功能强大但性能较差,仅当有复杂需求时选用。 以上三种方法均能够满足 “检查字符串是否包含另一字符串” 的需求,具体选择取决于实际应用场景和个人偏好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值