C++ 字符串比较
C++ 字符串比较是指对两个字符串进行求值,以确定它们是否相等或根据字典序排序的过程。
字符串比较可以使用内置运算符(例如 ==、!=、< 和 >)或 compare() 方法进行。但默认情况下,这些比较区分大小写,这意味着"tutorial point"和"Tutorial point"被视为不同的值。字符串比较在执行排序、搜索和输入验证等任务中起着重要作用。
C++ 中的字符串类型
C++ 中主要有两种字符串类型 -
- C 风格字符串 - C++ 中的这种字符串是一个包含空字符 ('\0') 的字符数组。
- std::string - 此字符串是 C++ 标准库的一部分,它提供了一种更强大、更用户友好的字符串处理方式,因为它可以自动管理内存,允许动态调整大小,并提供大量成员函数用于操作,例如连接、子字符串提取和搜索。
比较 C 风格字符串
以下是如何比较 C 风格字符串−
1. strcmp()
您可以使用 <cstring> 库中的 strcmp() 函数 来比较两个字符串。
示例
以下示例展示了两个 C 风格字符串之间的比较 −
#include <iostream> #include <cstring> int main() { const char* str1 = "hello"; const char* str2 = "Tutorialspoint Learner"; int result = strcmp(str1, str2); if (result < 0) { std::cout << "str1 is less than str2"; } else if (result > 0) { std::cout << "str1 is greater than str2"; } else { std::cout << "str1 is equal to str2"; } return 0; }
输出
str1 is greater than str2
解释
- strcmp 函数比较两个字符串,并返回负数 (str1 < str2)、零 (str1 = str2) 和正数 (str1 > str2)。
- 在本例中,按字典顺序排列的字符串"hello"大于"Tutorialspoint Learner",因此输出为"str1 is greater than str2"。
- 按字典顺序排列的字符串,根据 ASCII 值逐个字符进行比较,其中"h"(ASCII 为 104)和"T"(ASCII 为 84)。
- 因此,104 > 84,比较结果为"hello"大于"Tutorialspoint Learner"。
2. strcoll()
strcoll() 函数根据当前语言环境比较两个 C 字符串,这对于国际化非常有用。它的行为类似于 strcmp(),但考虑了特定于语言环境的规则。
示例
#include <iostream> #include <cstring> #include <locale> int main() { const char* str1 = "hello"; const char* str2 = "Tutorialspoint Learner"; // 设置语言环境(可选,取决于您的环境) std::setlocale(LC_COLLATE, "en_US.UTF-8"); int result = strcoll(str1, str2); if (result < 0) { std::cout << "str1 is less than str2"; } else if (result > 0) { std::cout << "str1 is greater than str2"; } else { std::cout << "str1 is equal to str2"; } return 0; }
输出
str1 is greater than str2
说明
- std::setlocale() 函数将字符串排序(比较)的区域设置设置为"en_US.UTF-8",即美国英语区域设置。
- strcoll() 函数根据当前区域设置比较 str1 和 str2。
- 如果 str1 < str2,则返回"-ve"值;如果相等,则返回 0;如果 str1 > str2,则返回"+ve"值。
- 由于 'h' (ASCII 104) > 'T' (ASCII 84) 因此输出为 'h' 大于 'T'。
比较 std::string
在 C++ 中,用于比较 std::string 对象的方法有很多,这些方法提供了访问其相等性或相对顺序的不同方式。
1. 比较运算符
比较运算符 可以直接比较两个 std::string 对象。
此比较也按字典顺序进行,这意味着字符的比较基于其 ASCII 值。这些比较如下 -
- ==(相等)
- !=(不等)
- < (小于)
- > (大于)
- <= (小于或等于)
- >= (大于或等于)
示例
#include <iostream> #include <string> int main() { std::string str1 = "Allen"; std::string str2 = "allen"; std::cout << (str1 == str2) << std::endl; // false (0) std::cout << (str1 != str2) << std::endl; // true (1) std::cout << (str1 < str2) << std::endl; // true (1) std::cout << (str1 > str2) << std::endl; // false (0) return 0; }
输出
0 1 1 0
解释
由于 A (65) 的 ASCII 值小于 a (97),因此会相应地接收输出。
2. std::string::compare() 方法
std::string::compare() 方法也用于比较两个字符串的值。它根据字典顺序返回一个整数值。
- 0:如果两个字符串相等
- > 0 (+ve):如果第一个字符串更大
- < 0 (-ve):如果第一个字符串更小
示例
#include <iostream> #include <string> int main() { std::string str1 = "apple"; std::string str2 = "banana"; std::cout << str1.compare(str2) << std::endl; std::cout << str1.compare("apple") << std::endl; return 0; }
输出
-1 0
解释
- 首先,由于 'a' (ASCII 97) 小于 'b' (ASCII 98),因此输出为负数 (-1)。
- 其次,由于 str1 和 "apple" 中存储的值相同,因此输出为 0。