c\c++中比较两个字符串或string对象是否相等

本文详细介绍了在编程过程中如何正确地比较字符串。对于char*类型的字符串,推荐使用strcmp函数进行比较,而对于string类型的字符串,则建议使用compare方法。文章还强调了在不同情况下避免使用“==”进行比较的重要性。

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

在写程序的过程中,经常会遇到要比较两个字符串是否相等的情况。如果要比较的对象是char*字符串,则利用
int strcmp(const char* s1,const char* s2)

    当s1<s2时,返回为负数;
    当s1==s2时,返回值= 0;
    当s1>s2时,返回正数。

即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。如:

特别注意:strcmp(const char s1,const char s2)这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。
ANSI标准规定,返回值为正数,负数,0 。而确切数值是依赖不同的C实现的。
如果要比较的对象是两个string,则利用函数compare()。若要比较string s1和s2则写为:s1.compare(s2),若返回值为0,则两者相等。
注意:在比较两个字符串时不能利用符号“==”,“==”符号比较的是两个字符串的地址是否相等,此前在这个问题上犯过错误,谨记!谨记!
若是比较两个字符,则可以用”==”直接进行比较~

但在比较两个string对象时是可以利用“==”的,相等的话,则表达式的返回值为1,不等为0。

举个简单的例子:

#include<iostream>
#include<cstring>
using namespace std;
int main() {
    char a[] = "aaa",b[]="aaa";
    string A = "AAA", B = "AAA";
    cout <<"*a和*b的值分别是:" <<*a << "," << *b << endl;
    cout <<"*“aaa”的值是:"<< *"aaa" << endl;
    cout <<"利用 == 比较a,b两个字符串,结果是(相等为1,不等为0):" <<(a==b) << endl;
    cout << "利用strcmp()比较a,b两个字符串,结果是(相等为0,不等非0):"<<strcmp(a,b) << endl;
    cout << "利用 == 比较A,B两个string,结果是(相等为1,不等为0):"<<(A==B) << endl;
    cout << "利用compare()比较A,B两个string,结果是(相等为0,不等非0):" << A.compare(B) << endl;
    return 0;
}

输出结果为:

*a和*b的值分别是:a,a
*“aaa”的值是:a
利用 == 比较a,b两个字符串,结果是(相等为1,不等为0):0
利用strcmp()比较a,b两个字符串,结果是(相等为0,不等非0):0
利用 == 比较A,B两个string,结果是(相等为1,不等为0):1
利用compare()比较A,B两个string,结果是(相等为0,不等非0):0

从程序中可以看到,在比较字符串不能用”==”的原因是字符串本身是一个地址,举例:

char a[]="aaa";

很容易理解a是一个指向字符串的指针,但同时也应该知道包含引号在内的”aaa”字符串本身也是一个地址,指向该字符串的首元素,故而会有 *”aaa”的结果为a。

对于string对象而言,则没这么多注意事项。。。



引自

<think>好的,用户问的是在C++比较两个字符串内容是否相等可以用哪些函数。我需要先回想一下C++字符串的类型,主要有种:C风格的字符串(字符数组)和C++的std::string。 首先,对于C风格的字符串,也就是以'\0'结尾的字符数组,比较的话应该用strcmp函数。这个函数在<string.h>者<cstring>头文件里。strcmp返回0的时候表示两个字符串相等。不过用户可能需要注意,如果直接用==比较的话,比较的是指针地址而不是内容,所以必须用strcmp。 然后是C++的std::string类型,这时候直接用==运算符就可以了,因为std::string已经重载了==操作符,比较的是内容。这是最方便的方法。另外,std::string还有compare成员函数,可以用来比较,返回0的话说明相等。不过大多数情况下直接用==更直观。 可能用户还不太清楚这字符串类型的区别,所以需要分开说明。比如,用户可能混淆了C风格和C++字符串比较方式。另外,可能需要提醒用户注意大小写敏感的问题,比如如果希望不区分大小写比较,可能需要自己转换者用其他方法,但题目里没有提到这点,可能不需要展开。 还有可能需要提到其他比较方法,比如STL中的算法,比如std::equal,不过这种情况可能用得比较少,尤其是在字符串比较上,直接使用==者strcmp更常见。不过还是可以简单提一下,作为扩展知识。 另外,需要注意用户是否了解C风格字符串和std::string的区别,可能需要简要说明者的定义方式。比如,C风格是char数组者指针,而std::string是类对象。这样用户在使用不同方法时不会混淆。 总结下来,回答的结构应该分为部分:C风格字符串C++的std::string。分别说明对应的比较函数,并给出示例代码。同时提醒常见错误,比如用==比较C风格字符串的问题。 再检查是否有遗漏的函数,比如strncmp,但这个是用来比较前n个字符,如果用户的问题是关于完全相等比较,可能不需要提到,但可以稍微带过,说明存在其他相关函数。 最后,确认示例代码的正确性,比如strcmp的使用,以及std::string的==操作符。确保用户能够直接复制代码使用,避免语法错误。</think>在 C++比较字符串内容是否相等,根据字符串类型的不同,有以下常用方法: --- ### 一、C 风格字符串 (char*/const char*) 使用 `<cstring>` 头文件中的函数: ```cpp #include <cstring> const char* str1 = "Hello"; const char* str2 = "World"; // 使用 strcmp 函数 if (strcmp(str1, str2) == 0) { // 返回 0 表示相等 // 字符串内容相等 } else { // 不相等 } ``` ⚠️ **注意**:直接使用 `==` 比较的是指针地址,而非内容: ```cpp if (str1 == str2) { /* 错误!永远不要这样比较内容! */ } ``` --- ### 二、C++ 标准字符串 (std::string) 直接使用 `==` 运算符(推荐): ```cpp #include <string> std::string s1 = "Hello"; std::string s2 = "World"; if (s1 == s2) { // 正确!直接比较内容 // 相等 } else { // 不相等 } ``` 使用 `compare()` 成员函数: ```cpp if (s1.compare(s2) == 0) { // 返回 0 表示相等 // 相等 } ``` --- ### 三、其他注意事项 1. **大小写敏感**:上述方法均区分大小写(如 "Hello" ≠ "hello")。 2. **部分比较**: - C 风格:用 `strncmp(str1, str2, n)` 比较前 `n` 个字符。 - `std::string`:用 `s1.compare(0, n, s2, 0, n) == 0`。 --- ### 总结对比表 | 字符串类型 | 推荐方法 | 头文件/库 | |------------------|--------------------------|----------------| | C 风格字符串 | `strcmp(str1, str2) == 0` | `<cstring>` | | `std::string` | `s1 == s2` | `<string>` | 根据实际需求选择合适的方法,优先推荐使用 `std::string` 的 `==` 运算符。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值