1.strcmp
函数详解
strcmp
是 C 标准库中最基础的字符串比较函数,用于按字典序比较两个以 null 结尾的字符串。
(1)函数原型
c
int strcmp(const char *str1, const char *str2);
(2)功能说明
- 比较两个以 null 结尾的字符串
str1
和str2
- 比较是基于字符的 ASCII 值(或当前 locale 的字符集)逐个进行的
- 比较过程会一直持续到遇到不同的字符或 null 终止符
返回值
返回值 | 含义 |
---|---|
< 0 | str1 小于 str2(按字典序) |
0 | str1 等于 str2 |
> 0 | str1 大于 str2 |
(3)典型实现
标准库实现通常是高度优化的,但基本逻辑如下:
c
int strcmp(const char *s1, const char *s2) {
while (*s1 && (*s1 == *s2)) {
s1++;
s2++;
}
return *(const unsigned char*)s1 - *(const unsigned char*)s2;
}
(4)使用示例
c
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "banana";
int result = strcmp(str1, str2);
if (result < 0) {
printf("'%s' comes before '%s'\n", str1, str2);
} else if (result > 0) {
printf("'%s' comes after '%s'\n", str1, str2);
} else {
printf("'%s' is same as '%s'\n", str1, str2);
}
return 0;
}
c
// 检查字符串是否以特定前缀开头
if (strcmp(str, "prefix") == 0) {
// 完全匹配
}
// 或者使用 strncmp 检查前缀
if (strncmp(str, "prefix", 6) == 0) {
// 前6个字符匹配
}
(5)重要特性
- 区分大小写:'A' 和 'a' 被认为是不同的字符
- 非本地化比较:基于字符编码值比较,不考虑语言规则
- 安全性:需要确保字符串以 null 结尾,否则可能导致缓冲区溢出
(6)相关函数
函数 | 描述 |
---|---|
strncmp | 比较字符串的前 n 个字符 |
stricmp /strcasecmp | 不区分大小写的比较 |
memcmp | 比较内存区域(不限于字符串) |
strcoll | 基于当前 locale 的比较 |