strncmp 是什么?
strncmp 是 C 标准库中的一个字符串函数,它的名字是 "string compare with length" 的缩写,意为“按长度比较字符串”。

(图片来源网络,侵删)
它的主要功能是比较两个字符串的前 n 个字符,并根据比较结果返回一个整数值,这个函数在需要限制比较范围时非常有用,可以避免比较整个字符串,从而提高效率或防止意外的越界访问。
函数原型
strncmp 函数的原型在 <string.h> 头文件中定义如下:
int strncmp(const char *str1, const char *str2, size_t n);
参数说明
str1: 第一个要比较的字符串。str2: 第二个要比较的字符串。n: 要比较的最大字符数。size_t是一个无符号整型。
返回值
strncmp 的返回值是一个整数,其含义与 strcmp 类似:
- 返回值 0:表示
str1和str2的前n个字符完全相同。 - 返回值大于 0:表示
str1的第一个不匹配字符的 ASCII 码值大于str2的对应字符,或者,str1的前n个字符都匹配,但str1的长度恰好为n(即str1是str2的一个前缀),也可能返回一个大于 0 的值(具体值取决于实现,但通常是str1中第n个字符的值)。 - 返回值小于 0:表示
str1的第一个不匹配字符的 ASCII 码值小于str2的对应字符,或者,str2的前n个字符都匹配,但str2的长度恰好为n(即str2是str1的一个前缀),也可能返回一个小于 0 的值。
重要提示:不要将返回值简单地理解为 1 或 -1,它返回的是第一个不匹配字符的差值,如果 str1 的字符是 'd' (ASCII 100),str2 的对应字符是 'a' (ASCII 97),则返回值可能是 100 - 97 = 3,在实际编程中,我们通常只关心返回值是零、正数还是负数。

(图片来源网络,侵删)
工作原理
- 函数从
str1和str2的第一个字符开始,逐个进行比较。 - 它会比较最多
n个字符。 - 比会在以下情况立即停止:
- 找到第一个不匹配的字符。
- 比较了
n个字符。 - 到达了
str1或str2的末尾(即遇到了'\0'字符)。
代码示例
下面通过几个例子来加深理解。
示例 1:基本比较
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "apple";
char str3[] = "apricot";
char str4[] = "app";
// 情况1: 前n个字符完全相同
int result1 = strncmp(str1, str2, 5);
printf("strncmp(\"apple\", \"apple\", 5) = %d\n", result1); // 输出: 0
// 情况2: 在n个字符内出现不同
int result2 = strncmp(str1, str3, 3);
printf("strncmp(\"apple\", \"apricot\", 3) = %d\n", result2); // 输出: 0 (因为前3个字符 'a', 'p', 'p' 相同)
int result3 = strncmp(str1, str3, 4);
printf("strncmp(\"apple\", \"apricot\", 4) = %d\n", result3); // 输出: < 0 (因为 'l' < 'r')
// 情况3: 一个字符串是另一个的前缀,且n等于较短字符串的长度
int result4 = strncmp(str1, str4, 3);
printf("strncmp(\"apple\", \"app\", 3) = %d\n", result4); // 输出: 0 (因为前3个字符 'a', 'p', 'p' 相同)
// 情况4: n大于两个字符串的长度
int result5 = strncmp(str1, str4, 10);
printf("strncmp(\"apple\", \"app\", 10) = %d\n", result5); // 输出: > 0 (因为 'app' < 'apple',在比较到 'app' 后,str4结束,str1还有字符)
return 0;
}
示例 2:实际应用(检查文件扩展名)
strncmp 在处理文件路径或检查特定前缀时非常常见。
#include <stdio.h>
#include <string.h>
int main() {
char filename1[] = "document.txt";
char filename2[] = "image.png";
char filename3[] = "script.js";
// 检查是否以 ".txt"
if (strncmp(filename1 + strlen(filename1) - 4, ".txt", 4) == 0) {
printf("'%s' 是一个文本文件,\n", filename1);
} else {
printf("'%s' 不是一个文本文件,\n", filename1);
}
// 检查是否以 ".png"
if (strncmp(filename2 + strlen(filename2) - 4, ".png", 4) == 0) {
printf("'%s' 是一个 PNG 图片,\n", filename2);
} else {
printf("'%s' 不是一个 PNG 图片,\n", filename2);
}
// 检查是否以 ".js"
if (strncmp(filename3 + strlen(filename3) - 3, ".js", 3) == 0) {
printf("'%s' 是一个 JavaScript 文件,\n", filename3);
} else {
printf("'%s' 不是一个 JavaScript 文件,\n", filename3);
}
return 0;
}
解释:filename1 + strlen(filename1) - 4 是一个指针运算,它指向字符串倒数第四个字符的位置,也就是 的位置,然后我们从这个位置开始,比较接下来的 4 个字符是否等于 ".txt"。
strncmp vs. strcmp
| 特性 | strncmp |
strcmp |
|---|---|---|
| 功能 | 比较两个字符串的前 n 个字符 | 比较两个字符串的所有字符,直到遇到 '\0' 或发现不同 |
| 原型 | int strncmp(const char *s1, const char *s2, size_t n); |
int strcmp(const char *s1, const char *s2); |
| 参数 | 需要 3 个参数,包括 n |
需要 2 个参数 |
| 用途 | 限制比较范围,提高效率,防止比较过长字符串 | 比较整个字符串是否相等 |
| 边界情况 | 当 n 为 0 时,直接返回 0 |
如果一个字符串是另一个的前缀,较短的字符串被认为“小于”较长的 |
strncmp 是一个强大且灵活的字符串比较函数,当你不需要比较整个字符串,或者只想比较字符串的某个部分时,它比 strcmp 更合适、更安全,理解它的三个参数和返回值规则是掌握它的关键。
