前言
如果,想要深入的学习标准C库中strcmp,strncmp函数,还是需要去自己阅读Linux系统中的帮助文档。
具体输入命令:
man 3 strcmp/strncmp
即可查阅到完整的资料信息。
strcmp 函数
strcmp函数是标准C库(C Standard Library)中的一个用于比较字符串的函数。它的原型定义在<string.h>头文件中。
- strcmp函数比较两个C风格字符串(以空字符’\0’结尾的字符数组),并根据比较结果返回一个整数值。
函数原型如下:
#include <string.h>//使用此函数需要导入此头文件
int strcmp(const char *str1, const char *str2);
参数:
- 其中,str1和str2是指向两个需要比较的字符串的指针。
返回值:
- 如果str1和str2相等(即两个字符串具有相同的字符并以空字符’\0’结尾),则strcmp返回0。
- 如果str1在字典顺序上小于str2(即str1的第一个不同字符的ASCII值小于str2的对应字符),则strcmp返回一个负整数。
如果str1在字典顺序上大于str2(即str1的第一个不同字符的ASCII值大于str2的对应字符),则strcmp返回一个正整数。
用法示例
下面是一些使用strcmp函数的示例:
判断两个字符串是否相等:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "hello";
char str2[] = "world";
char str3[] = "hello";
if (strcmp(str1, str2) == 0) {
printf("str1 and str2 are equal\n");
} else {
printf("str1 and str2 are not equal\n");
}
if (strcmp(str1, str3) == 0) {
printf("str1 and str3 are equal\n");
} else {
printf("str1 and str3 are not equal\n");
}
return 0;
}
对字符串进行排序:
#include <stdio.h>
#include <string.h>
void sort_strings(char arr[][100], int n) {
char temp[100];
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (strcmp(arr[i], arr[j]) > 0) {
strcpy(temp, arr[i]);
strcpy(arr[i], arr[j]);
strcpy(arr[j], temp);
}
}
}
}
int main() {
int n = 4;
char arr[][100] = {"orange", "apple", "banana", "grape"};
sort_strings(arr, n);
for (int i = 0; i < n; i++) {
printf("%s\n", arr[i]);
}
return 0;
}
请注意,当使用strcmp函数时,需要确保传入的字符串指针有效且指向以空字符'\0'结尾的字符数组,否则可能导致未定义行为。
也是就说,这个函数对比的字符数组是2个C风格的字符串(以空字符’\0’结尾的字符数组)
如果说,strcmp函数比较的不是两个C风格字符串会发生什么?
如果strcmp函数比较的不是两个以空字符’\0’结尾的C风格字符串,那么它可能导致未定义行为(Undefined Behavior)。
-
在这种情况下,程序可能表现出不稳定的行为,例如崩溃、错误输出或其他不可预测的结果。
-
当strcmp函数进行字符串比较时,它依赖于空字符’\0’作为字符串结束的标志。如果字符串没有以’\0’结尾,strcmp会继续比较后面的内存地址,直到遇到一个’\0’字符。这可能会导致访问非法内存区域,从而引发程序崩溃(如访问越界)或泄露敏感信息(如访问其他变量的内存空间)。
-
要避免这种情况,请确保在使用strcmp函数之前始终检查字符串是否以’\0’结尾。如果不能确定字符串是否以空字符结尾,可以考虑使用其他字符串处理函数,例如
strncmp
,它允许指定要比较的最大字符数,从而避免潜在的未定义行为。
strncmp 函数
strncmp函数是标准C库(C Standard Library)中的一个用于比较字符串的函数。与strcmp函数类似,strncmp函数也用于比较两个C风格字符串(以空字符’\0’结尾的字符数组),但它只比较前n个字符。
strncmp函数的原型定义在<string.h>头文件中。
函数原型如下:
int strncmp(const char *str1, const char *str2, size_t n);
参数:
- 其中,str1和str2是指向两个需要比较的字符串的指针,n是要比较的最大字符数。
- size_t是无符号整数类型,用于表示对象的大小。
返回值:
- 如果str1和str2的前n个字符相等(或者在比较过程中遇到了空字符’\0’),则strncmp返回0。
- 如果str1在字典顺序上小于str2(即str1的第一个不同字符的ASCII值小于str2的对应字符),则strncmp返回一个负整数。
- 如果str1在字典顺序上大于str2(即str1的第一个不同字符的ASCII值大于str2的对应字符),则strncmp返回一个正整数。
用法示例
下面是一些使用strncmp函数的示例:
- 比较两个字符串的前3个字符:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "hello";
char str2[] = "helicopter";
if (strncmp(str1, str2, 3) == 0) {
printf("The first 3 characters of str1 and str2 are equal\n");
} else {
printf("The first 3 characters of str1 and str2 are not equal\n");
}
return 0;
}
- 使用strncmp来安全地比较两个可能没有以空字符’\0’结尾的字符串:
#include <stdio.h>
#include <string.h>
int main() {
char str1[10];
char str2[10];
// 假设这两个字符串来自某个不可信的来源,并且可能没有以'\0'结尾
strncpy(str1, "hello", 5);
strncpy(str2, "helicopter", 5);
if (strncmp(str1, str2, 5) == 0) {
printf("The first 5 characters of str1 and str2 are equal\n");
} else {
printf("The first 5 characters of str1 and str2 are not equal\n");
}
return 0;
}
请注意,当使用strncmp函数时,需要确保传入的字符串指针有效。虽然strncmp函数在比较时限制了最大字符数,但如果指针无效,依然可能导致未定义行为
。