c++ string startsWith endswith

本文介绍了一个简单的C++程序,该程序定义了两个函数:startsWith和endsWith,用于判断一个字符串是否以特定的子串开始或结束。通过具体示例演示了如何使用这两个函数,并展示了输出结果。

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

模拟一下

#include<string>
#include<iostream>
using namespace std;

int startsWith(string s, string sub){
        return s.find(sub)==0?1:0;
}

int endsWith(string s,string sub){
        return s.rfind(sub)==(s.length()-sub.length())?1:0;
}

int main(){
        string str = "helloWorld";
        string preStr = "he";
        string sufStr = "rld";
        if(startsWith(str,preStr)){
                cout<<str + " starts with "+preStr<<endl;
        }
        if(endsWith(str,sufStr)){
                cout<<str+" ends with "+sufStr<<endl;
        }
        return 0;
}
<think>我们正在讨论如何比较两个字符串。根据之前的引用和用户的问题,用户希望了解如何比较两个字符串(可能是C/C++,但引用中也提到了Python和Java的方法)。由于用户没有指定语言,我将涵盖几种常见语言的方法,并重点放在C/C++上,因为之前的引用中C/C++的内容较多。 关键点: 1. 在C语言中,字符串是字符数组,以'\0'结尾。比较字符串不能直接用==(因为==比较的是指针地址,而不是内容),而应该使用strcmp函数。 2. 在C++中,如果使用std::string,则可以直接使用==、!=、<、>等运算符进行比较,也可以使用compare成员函数。 3. 在Python中,可以直接使用==和!=比较字符串内容。 4. 在Java中,使用equals()方法比较字符串内容,不能使用==(因为==比较的是引用)。 根据引用[2]和[4],在C++中: - 使用==运算符比较两个std::string对象,比较的是内容。 - 使用compare()成员函数,返回0表示相等。 根据引用[3]和[5],在Java中: - 使用equals()方法比较两个字符串的内容。 根据引用[4],在C语言中: - 不能使用==比较字符串内容,因为那比较的是地址。 - 必须使用strcmp函数,当strcmp返回0时表示两个字符串相等。 因此,我将分语言介绍如何比较两个字符串。 注意:用户的问题中引用了多种语言,但用户的上一个问题(char计算长度)是关于C/C++的,因此我们以C/C++为主,同时简要介绍其他语言。 结构: 一、C语言中的字符串比较 二、C++中的字符串比较(两种:C风格和string类) 三、其他语言(Python、Java)的字符串比较(简要) 四、总结 注意:在C语言中,字符串是字符数组,以'\0'结尾,所以比较函数strcmp依赖于遇到'\0',因此必须确保字符串以'\0'结尾。 下面开始详细回答。</think>### 如何比较两个字符串? 在不同编程语言中,字符串比较的实现方式有显著差异。以下是主流语言的实现方法及关键注意事项: --- #### 一、C 语言:字符数组比较 **必须使用 `strcmp()` 函数**(不可用 `==` 直接比较) ```c #include <string.h> char str1[] = "hello"; char str2[] = "world"; // 比较结果: // 0:相等 // <0:str1 < str2 // >0:str1 > str2 int result = strcmp(str1, str2); ``` ✅ **安全要点**: 1. **`==` 陷阱**: ```c char* s1 = "abc"; char s2[] = "abc"; printf("%d", s1 == "abc"); // 1(地址相同) printf("%d", s2 == "abc"); // 0(地址不同) ``` `==` 比较的是**内存地址**而非内容。 2. **终止符要求**: 若字符串未以 `'\0'` 结尾,`strcmp` 会导致未定义行为(内存越界)。 3. **大小写敏感**: 忽略大小写需用 `strcasecmp()`(POSIX 标准)或自行转换大小写。 --- #### 二、C++:`std::string` 对象比较 **直接使用运算符**(底层自动处理内容比较) ```cpp #include <string> std::string s1 = "apple"; std::string s2 = "Apple"; // 方法1:运算符(最简洁) if (s1 == s2) { /* 相等 */ } if (s1 < s2) { /* s1字典序小于s2 */ } // 方法2:compare()(返回int,类似strcmp) int result = s1.compare(s2); // 0表示相等 ``` ✅ **安全要点**: 1. **`c_str()` 陷阱**: ```cpp std::string s = "test"; if (s.c_str() == "test") // 错误!仍比较地址 ``` 应转换为 `std::string` 再比较:`if (s == "test")`。 2. **效率优势**: `operator==` 时间复杂度 $O(n)$,但比 `strcmp` 更安全(自动处理长度和 `\0`)。 --- #### 三、Python:直接内容比较 **使用 `==` 或字符串方法** ```python s1 = "Hello" s2 = "hello" # 方法1:== 运算符(区分大小写) if s1 == s2: # False print("Equal") # 方法2:忽略大小写 if s1.lower() == s2.lower(): # True print("Equal (case-insensitive)") # 方法3:前缀/后缀检查 if s1.startswith("He"): # True print("Starts with 'He'") ``` ✅ **关键方法**: | 方法 | 作用 | 示例 | |--------------------|-----------------------------|--------------------------| | `==`, `!=` | 内容相等性比较 | `"abc" == "abc"` → `True` | | `is` | 对象标识符比较(慎用) | `s1 is s2` → 通常为 `False` | | `str.startswith()` | 检查前缀 | `"hello".startswith("he")` | | `str.endswith()` | 检查后缀 | `"world".endswith("ld")` | > 📌 Python 中 `==` 比较内容,`is` 比较对象ID(仅当字符串驻留时可能相同)。 --- #### 四、Java:使用 `equals()` 方法 **禁止用 `==` 比较内容** ```java String s1 = new String("hello"); String s2 = "hello"; // 正确:内容比较 if (s1.equals(s2)) { // true System.out.println("Content equal"); } // 错误:地址比较 if (s1 == s2) { // false(s1在堆,s2在常量池) System.out.println("Address equal?"); } ``` ✅ **关键方法**: | 方法 | 作用 | |--------------------------|-----------------------------| | `str.equals(Object)` | 区分大小写的内容比较 | | `str.equalsIgnoreCase()` | 忽略大小写的内容比较 | | `str.compareTo()` | 字典序比较(返回差值) | --- ### 总结:跨语言比较规则 | 语言 | 正确方法 | 错误方法 | 时间复杂度 | |---------|----------------------------|--------------|-----------| | C | `strcmp(s1, s2) == 0` | `s1 == s2` | $O(n)$ | | C++ | `s1 == s2` | `s1.c_str() == s2` | $O(n)$ | | Python | `s1 == s2` | `s1 is s2` | $O(n)$ | | Java | `s1.equals(s2)` | `s1 == s2` | $O(n)$ | > 💡 **黄金准则**: > - **C 风格字符串**:始终用 `strcmp()` 族函数 > - **面向对象字符串**(C++/Python/Java):直接用 `==` 或类方法(如 `equals()`) > - 所有比较均**区分大小写**,忽略大小写需显式转换(如 `lower()`) --- ### 附:字典序比较原理 所有语言均按字符的 **Unicode 码点**(如 ASCII 值)从左到右逐位比较: ```python "apple" < "banana" # 因为 'a' (97) < 'b' (98) "Zebra" < "apple" # 因为 'Z' (90) < 'a' (97) ``` 当字符相同但长度不同时,短字符串小于长字符串: ```c strcmp("abc", "abcd") < 0 // 输出负值 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值