目录
1 字符串比较
strcmp()
和 strncmp()
函数是C语言标准库中用于比较两个字符串的函数。
1.1 strcmp() 函数
strcmp 进行字符串比较,主要是通过比较字符串中的字符对应的 ASCII 码值, strcmp 会根据 ASCII 编码依次比较 str1 和 str2 的每一个字符,直到出现了不同的字符,或者某一字符串已经到达末尾(遇见了字符串结束字符' \0 ')。函数原型如下:
#include <string.h>
int strcmp(const char *str1, const char *str2);
参数:两个字符串 str1
和 str2
1.2 strncmp() 函数
strncmp()与 strcmp()函数一样,也用于对字符串进行比较操作,但最多比较前 n 个字符, strncmp()函数原型如下所示:
int strncmp(const char *str1, const char *str2, size_t n);
参数:两个字符串 str1
和 str2
这两个函数都接受指针作为参数,指向要比较的字符串。strcmp()
比较两个完整的字符串,而 strncmp()
只比较每个字符串的前 n
个字符。两个函数的返回值如下:
- 返回
0
如果两个字符串相等。 - 返回小于
0
的值如果第一个字符串在字典序上小于第二个字符串。 - 返回大于
0
的值如果第一个字符串在字典序上大于第二个字符串。
1.3 示例程序
下面的示例程序使用 strcmp()
和 strncmp()
函数来比较两个用户输入的字符串。
#include <stdio.h>
#include <string.h>
#define MAX_STR_LEN 100 // 定义字符串的最大长度
int main()
{
char str1[MAX_STR_LEN], str2[MAX_STR_LEN]; // 存储用户输入的两个字符串
int n; // 存储用户输入的参数n,用于strncmp()比较的字符数
// 获取用户输入的第一个字符串
printf("请输入第一个字符串:");
fgets(str1, MAX_STR_LEN, stdin);
str1[strcspn(str1, "\n")] = 0; // 去除末尾的换行符
// 获取用户输入的第二个字符串
printf("请输入第二个字符串:");
fgets(str2, MAX_STR_LEN, stdin);
str2[strcspn(str2, "\n")] = 0; // 去除末尾的换行符
// 获取用户输入的参数n
printf("请输入要比较的字符数n:");
scanf("%d", &n);
// 确保n不会超过字符串的最大长度
n = n > MAX_STR_LEN ? MAX_STR_LEN : n;
// 使用strcmp()函数比较两个完整字符串
int strcmp_result = strcmp(str1, str2);
printf("使用strcmp()比较两个完整字符串的结果:");
if (strcmp_result == 0) {
printf("两个字符串相等。\n");
} else if (strcmp_result < 0) {
printf("第一个字符串小于第二个字符串。\n");
} else {
printf("第一个字符串大于第二个字符串。\n");
}
// 使用strncmp()函数比较两个字符串的前n个字符
int strncmp_result = strncmp(str1, str2, n);
printf("使用strncmp()比较两个字符串的前%d个字符的结果:", n);
if (strncmp_result == 0) {
printf("两个字符串的前%d个字符相等。\n", n);
} else if (strncmp_result < 0) {
printf("第一个字符串的前%d个字符小于第二个字符串的前%d个字符。\n", n, n);
} else {
printf("第一个字符串的前%d个字符大于第二个字符串的前%d个字符。\n", n, n);
}
return 0;
}
程序首先使用 strcmp()
对两个完整字符串进行比较,然后使用 strncmp()
对两个字符串的前 n
个字符进行比较。运行结果如下:
2 字符串查找
字符串查找在平时的编程当中也是一种很常见的操作,譬如从一个给定的字符串当中查找某一个字符或者一个字符串,并获取它的位置。 C 语言函数库中也提供了一些用于字符串查找的函数,包括 strchr()、strrchr()、 strstr()、 strpbrk()、 index()以及 rindex()等。下面是每个函数的作用和原型:
index()
和 rindex()
已被标准化的新函数取代,并且可能在某些编译器中不可用或在未来的C标准中被移除。
2.1 strchr() 函数
strchr() 函数在字符串中查找第一次出现指定字符的位置。函数原型如下:
#include <string.h>
char *strchr(const char *s, int c);
s
:要搜索的字符串。c
:要查找的字符。
2.2 strrchr() 函数
strrchr() 函数从字符串末尾开始查找最后一次出现指定字符的位置,参数和返回值与 strchr()
相同,但是搜索方向是从末尾到开头。。函数原型如下:
#include <string.h>
char *strrchr(const char *s, int c);
s
:要搜索的字符串。c
:要查找的字符
2.3 strstr() 函数
strstr() 函数在字符串中查找第一次出现子字符串的位置。函数原型:
char *strstr(const char *haystack, const char *needle);
haystack
:要搜索的字符串。needle
:要查找的子字符串。
2.4 strpbrk() 函数
strpbrk() 函数在字符串中查找任意字符在另一字符串中首次出现的位置。函数原型如下:
char *strpbrk(const char *s1, const char *s2);
s1
:要搜索的字符串。s2
:包含要查找的字符集的字符串。
2.5 示例程序
下面的示例程序使用 strchr()
、strrchr()
、strstr()
和 strpbrk()
函数来查找字符或子字符串,并使用条件语句检查是否找到了它们。如果找到了,我们计算字符或子字符串的位置,并打印出来。
#include <stdio.h>
#include <string.h>
#define MAX_STR_LEN 100
int main() {
char str[MAX_STR_LEN]; // 用户输入的源字符串
char charToFind; // 用户希望查找的字符
char substr[MAX_STR_LEN]; // 用户希望查找的子字符串
char charsToBreak[MAX_STR_LEN]; // 用户希望用于strpbrk的字符集
// 初始化字符串
memset(str, 0, MAX_STR_LEN);
memset(substr, 0, MAX_STR_LEN);
memset(charsToBreak, 0, MAX_STR_LEN);
// 获取用户输入的源字符串
printf("请输入源字符串:");
fgets(str, MAX_STR_LEN, stdin);
str[strcspn(str, "\n")] = 0; // 去除末尾的换行符
// 获取用户希望查找的字符
printf("请输入要查找的字符:");
scanf("%c", &charToFind);
scanf("%*c"); // 清除缓冲区中的换行符
// 获取用户希望查找的子字符串
printf("请输入要查找的子字符串:");
fgets(substr, MAX_STR_LEN, stdin);
substr[strcspn(substr, "\n")] = 0; // 去除末尾的换行符
// 获取用户希望用于strpbrk的字符集
printf("请输入用于strpbrk的字符集(例如: 'abc123'):");
fgets(charsToBreak, MAX_STR_LEN, stdin);
charsToBreak[strcspn(charsToBreak, "\n")] = 0; // 去除末尾的换行符
// 使用strchr查找字符
char *chrPos = strchr(str, charToFind);
printf("strchr找到的位置:%s\n", chrPos ? "找到" : "未找到");
if (chrPos) {
printf("位置:%zu\n", chrPos - str + 1); // 输出字符在字符串中的位置
}
// 使用strrchr从末尾查找字符
chrPos = strrchr(str, charToFind);
printf("strrchr找到的位置:%s\n", chrPos ? "找到" : "未找到");
if (chrPos) {
printf("位置:%zu\n", chrPos - str + 1); // 输出字符在字符串中的位置
}
// 使用strstr查找子字符串
chrPos = strstr(str, substr);
printf("strstr找到的子字符串位置:%s\n", chrPos ? "找到" : "未找到");
if (chrPos) {
printf("位置:%zu\n", chrPos - str + 1); // 输出子字符串在字符串中的位置
}
// 使用strpbrk查找任意字符在字符集中首次出现的位置
chrPos = strpbrk(str, charsToBreak);
printf("strpbrk找到的位置:%s\n", chrPos ? "找到" : "未找到");
if (chrPos) {
printf("位置:%zu\n", chrPos - str + 1); // 输出字符在字符串中的位置
}
return 0;
}
函数运行结果如下: