文章目录
前言
抽个时间整理了一下工作以来用过的比较常用的关于字符串函数,有些也是工作中偶尔遇到,大家有个印象就好。参考菜鸟教程:https://www.runoob.com/
版本迭代
时间 | 版本 | 版本改动 |
---|---|---|
2024.8.22 | V1.0 | 初始版本 |
2024.8.24 | V1.1 | 新增strncasecmp函数、strcasecmp函数 |
strcpy函数
声明
char *strcpy(char *dest, const char *src)
描述
把 src 所指向的字符串复制到 dest中。
参数
- dest – 指向用于存储复制内容的目标数组。
- src – 要复制的字符串。
返回值
该函数返回一个指向最终的目标字符串 dest 的指针。
实例
#include <stdio.h>
#include <string.h>
int main()
{
char src[40];
char dest[100];
memset(dest, '\0', sizeof(dest));
strcpy(src, "This is runoob.com");
strcpy(dest, src);
printf("最终的目标字符串: %s\n", dest);
return(0);
}
结果
最终的目标字符串: This is runoob.com
strncpy函数
声明
char *strncpy(char *dest, const char *src, size_t n)
描述
把src所指向的字符串复制到dest,最多复制n个字符。当src的长度小于n时,dest的剩余部分将用空字节填充。
参数
- dest – 指向用于存储复制内容的目标数组。
- src – 要复制的字符串。
- n – 要从源中复制的字符数。
返回值
该函数返回最终复制的字符串。
实例
#include <stdio.h>
#include <string.h>
int main()
{
char src[40];
char dest[12];
memset(dest, '\0', sizeof(dest));
strcpy(src, "This is runoob.com");
strncpy(dest, src, 10);
printf("最终的目标字符串: %s\n", dest);
return(0);
}
结果
最终的目标字符串: This is ru
strcat函数
声明
char *strcat(char *dest, const char *src)
描述
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。(它会把dest结尾的\0去除然后再拼接src字符串)
参数
- dest – 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
- src – 指向要追加的字符串,该字符串不会覆盖目标字符串。
返回值
该函数返回一个指向最终的目标字符串 dest 的指针。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
char src[50], dest[50];
strcpy(src, "This is source");
strcpy(dest, "This is destination");
strcat(dest, src);
printf("最终的目标字符串: |%s|", dest);
return(0);
}
结果
最终的目标字符串: |This is destinationThis is source|
strncat函数(比较少使用)
声明
char *strncat(char *dest, const char *src, size_t n)
描述
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。
参数
- dest – 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。
- src – 要追加的字符串。
- n – 要追加的最大字符数。
返回值
该函数返回一个指向最终的目标字符串 dest 的指针。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
char src[50], dest[50];
strcpy(src, "This is source");
strcpy(dest, "This is destination");
strncat(dest, src, 15);
printf("最终的目标字符串: |%s|", dest);
return(0);
}
结果
最终的目标字符串: |This is destinationThis is source|
strcmp函数
声明
int strcmp(const char *str1, const char *str2)
描述
把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
参数
- str1 – 要进行比较的第一个字符串。
- str2 – 要进行比较的第二个字符串。
返回值
该函数返回值如下:
- 如果返回值小于 0,则表示 str1 小于 str2。
- 如果返回值大于 0,则表示 str1 大于 str2。
- 如果返回值等于 0,则表示 str1 等于 str2。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[15];
char str2[15];
int ret;
strcpy(str1, "abcdef");
strcpy(str2, "ABCDEF");
ret = strcmp(str1, str2);
if(ret < 0)
{
printf("str1 小于 str2");
}
else if(ret > 0)
{
printf("str1 大于 str2");
}
else
{
printf("str1 等于 str2");
}
return(0);
}
结果
str1 大于 str2
strncmp函数
声明
int strncmp(const char *str1, const char *str2, size_t n)
描述
用于比较两个字符串的前 n 个字符是否相等。
参数
- str1 – 要进行比较的第一个字符串。
- str2 – 要进行比较的第二个字符串。
- n – 要比较的最大字符数。
返回值
该函数返回值如下:
- 如果返回值 < 0,则表示 str1 小于 str2。
- 如果返回值 > 0,则表示 str1 大于 str2。
- 如果返回值 = 0,则表示 str1 等于 str2。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[15];
char str2[15];
int ret;
strcpy(str1, "abcdef");
strcpy(str2, "ABCDEF");
ret = strncmp(str1, str2, 4);
if(ret < 0)
{
printf("str1 小于 str2");
}
else if(ret > 0)
{
printf("str2 小于 str1");
}
else
{
printf("str1 等于 str2");
}
return(0);
}
结果
str2 小于 str1
strcasecmp函数
声明
int strcasecmp(const char *s1, const char *s2);
描述
用于比较两个字符串 s1 和 s2,在比较过程中不区分大小写。它逐字符比较两个字符串,直到遇到不同的字符或到达字符串末尾。
参数
- s1: 指向第一个字符串的指针。
- s2: 指向第二个字符串的指针。
返回值
- 如果s1小于s2,返回一个负值。
- 如果s1大于s2,返回一个正值。
- 如果s1等于s2,返回 0。
实例
#include <stdio.h>
#include <strings.h>
int main() {
char *str1 = "Hello";
char *str2 = "hello";
int result = strcasecmp(str1, str2);
if (result == 0) {
printf("The strings are equal.\n");
} else if (result < 0) {
printf("The first string is less than the second string.\n");
} else {
printf("The first string is greater than the second string.\n");
}
return 0;
}
结果
The strings are equal.
strncasecmp函数
声明
int strncasecmp(const char *s1, const char *s2, size_t n);
描述
比较两个字符串 s1 和 s2,在比较过程中不区分大小写,并且最多比较 n 个字符。(跟上面的strcasecmp用法很像,但是strncasecmp可以自定义比较的字符数n)
参数
- s1: 指向第一个字符串的指针。
- s2: 指向第二个字符串的指针。
- n: 需要比较的最大字符数。
返回值
- 如果s1小于s2,返回一个负值。
- 如果s1大于s2,返回一个正值。
- 如果s1在前n个字符内等于s2,返回 0。
实例
#include <stdio.h>
#include <strings.h>
int main() {
char *str1 = "HelloWorld";
char *str2 = "helloworld";
int result = strncasecmp(str1, str2, 5); // Compare first 5 characters
if (result == 0) {
printf("The first 5 characters of the strings are equal.\n");
} else if (result < 0) {
printf("The first string is less than the second string in the first 5 characters.\n");
} else {
printf("The first string is greater than the second string in the first 5 characters.\n");
}
return 0;
}
结果
The first 5 characters of the strings are equal.
strchr函数(比较少使用)
声明
char *strchr(const char *str, int c)
描述
用于查找字符串中的一个字符,并返回该字符在字符串中第一次出现的位置。
参数
- str – 要查找的字符串。
- c – 要查找的字符。
返回值
如果在字符串 str 中找到字符 c,则函数返回指向该字符的指针,如果未找到该字符则返回 NULL。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
const char str[] = "https://www.runoob.com";
const char ch = 'o';
char *ptr;
ptr = strchr(str, ch);
if (ptr != NULL) {
printf("字符 'o' 出现的位置为 %ld。\n", ptr - str + 1);
printf("|%c| 之后的字符串是 - |%s|\n", ch, ptr);
} else {
printf("没有找到字符 'o' 。\n");
}
return(0);
}
结果
字符 'o' 出现的位置为 16。
|o| 之后的字符串是 - |oob.com|
strrchr函数(几乎不使用)
声明
char *strrchr(const char *str, int c)
描述
在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。
参数
- str – C 字符串。
- c – 要搜索的字符,通常以整数形式传递(ASCII 值),但是最终会转换回 char 形式。
返回值
strrchr() 函数从字符串的末尾开始向前搜索,直到找到指定的字符或搜索完整个字符串。如果找到字符,它将返回一个指向该字符的指针,否则返回 NULL。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
int len;
const char str[] = "https://www.runoob.com";
const char ch = '.';
char *ret;
ret = strrchr(str, ch);
printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
return(0);
}
结果
|.| 之后的字符串是 - |.com|
strspn函数(很少用)
声明
size_t strspn(const char *str1, const char *str2)
描述
检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标。(个人理解:str2是一个字符列表,str1字符从头开始和str2中的字符列表一个一个对比,如果str1中的字符不在str2的字符列表中,函数结束,返回str1中在str2字符列表中字符的个数)
参数
- str1 – 要被检索的 C 字符串。
- str2 – 该字符串包含了要在 str1 中进行匹配的字符列表。
返回值
该函数返回 str1 中第一个不在字符串 str2 中出现的字符下标。
实例
#include <stdio.h>
#include <string >;
int main()
{
int len1, len2;
char buffer[] = "25,142,330,Smith,J,239-4123";
len1 = strspn(buffer, "0123456789");
len2 = strspn(buffer, ",0123456789");//逗号在str2的字符列表里面
printf(" len1为:%d;len2为:%d", len1, len2);
getchar();
return 0;
}
结果
len1为:2;len2为:11
strcspn函数(没用过)
声明
size_t strcspn(const char *str1, const char *str2)
描述
检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符。(跟上面的strspn用法相反)
参数
- str1 – 要被检索的 C 字符串。
- str2 – 该字符串包含了要在 str1 中进行匹配的字符列表。
返回值
该函数返回 str1 开头连续都不含字符串 str2 中字符的字符数。
实例1
#include <stdio.h>
#include <string.h>
int main ()
{
int len;
const char str1[] = "ABCDEF4960910";
const char str2[] = "013";
len = strcspn(str1, str2);
printf("第一个匹配的字符是在 %d\n", len + 1);
return(0);
}
结果1
第一个匹配的字符是在 10//str1中的前9个字符都不在str2中,只有第十个字符0在str2的字符列表中。
实例2
参考:https://blog.csdn.net/m0_61629312/article/details/130174730
/* 密码必须包含大小写和特殊字符 */
#include<stdio.h>
#include<string.h>
int IsCodeLegal(char* code){
char* rule1="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char* rule2="abcdefghijklmnopqrstuvwxyz";
char* rule3="~!@#$%^&*";
int result_rule1=0,result_rule2=0,result_rule3=0;
result_rule1=strcspn(rule1,code);
result_rule2=strcspn(rule2,code);
result_rule3=strcspn(rule3,code);
if(result_rule1==26||result_rule2==26||result_rule3==9)
return 0;
else
return 1;
}
int main(){
char* code1="1234567890";
char* code2="123@Ab27418";
printf("%s,%s\n",code1,IsCodeLegal(code1)?"合法":"不合法");
printf("%s,%s\n",code2,IsCodeLegal(code2)?"合法":"不合法");
}
结果2
1234567890,不合法
123@Ab27418,合法
strpbrk函数(很少用)
声明
char *strpbrk(const char *str1, const char *str2)
描述
检索字符串 str1 中第一个匹配字符串 str2 中字符的字符,不包含空结束字符。也就是说,依次检验字符串 str1 中的字符,当被检验字符在字符串 str2 中也包含时,则停止检验,并返回该字符位置。
参数
- str1 – 要被检索的 C 字符串。
- str2 – 该字符串包含了要在 str1 中进行匹配的字符列表。
返回值
该函数返回 str1 中第一个匹配字符串 str2 中字符的字符数,如果未找到字符则返回 NULL。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
const char str1[] = "abcde2fghi3jk4l";
const char str2[] = "34";
char *ret;
ret = strpbrk(str1, str2);
if(ret)
{
printf("第一个匹配的字符是: %c\n", *ret);
}
else
{
printf("未找到字符");
}
return(0);
}
结果
第一个匹配的字符是: 3
strstr函数
声明
char *strstr(const char *haystack, const char *needle)
描述
在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 ‘\0’。
参数
- haystack – 要被检索的 C 字符串。
- needle – 在 haystack 字符串内要搜索的小字符串。
返回值
该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。
实例
#include <stdio.h>
#include <string.h>
int main()
{
const char haystack[20] = "RUNOOB";
const char needle[10] = "NOOB";
char *ret;
ret = strstr(haystack, needle);
printf("子字符串是: %s\n", ret);
return(0);
}
结果
子字符串是: NOOB
strlen函数
声明
size_t strlen(const char *str)
描述
计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
参数
- str – 要计算长度的字符串。
返回值
该函数返回字符串的长度。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
char str[50];
int len;
strcpy(str, "This is runoob.com");
len = strlen(str);
printf("|%s| 的长度是 |%d|\n", str, len);
return(0);
}
结果
|This is runoob.com| 的长度是 |18|
strtok函数
声明
char *strtok(char *str, const char *delim)
描述
分解字符串 str 为一组字符串,delim 为分隔符。
参数
- str – 要被分解成一组小字符串的字符串。
- delim – 包含分隔符的 C 字符串。
返回值
该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。
实例
#include <string.h>
#include <stdio.h>
int main () {
char str[80] = "This is - www.runoob.com - website";
const char s[2] = "-";
char *token;
/* 获取第一个子字符串 */
token = strtok(str, s);
/* 继续获取其他的子字符串 */
while( token != NULL ) {
printf( "%s\n", token );
token = strtok(NULL, s);
}
return(0);
}
结果
This is
www.runoob.com
website
strsep函数
声明
char *strsep(char **stringp, const char *delim);
描述
strsep
函数用于分割字符串。它查找由 delim
字符串参数指定的分隔符集,在 *stringp
指向的字符串中找到第一个这样的分隔符,并将其替换为 NULL 字符(‘\0’),从而分割字符串。然后,strsep
更新 *stringp
指针以指向下一个分割后的字符串(如果存在的话),并返回指向当前分割出的字符串的指针。如果 *stringp
是 NULL,则 strsep
返回 NULL。
参数
char **stringp
:指向字符指针的指针,该指针指向要分割的字符串。在每次函数调用后,*stringp
会被更新为指向下一个分割后的字符串(如果有的话)。const char *delim
:指向分隔符字符串的指针,strsep
会在*stringp
指向的字符串中查找这些分隔符来分割字符串。
返回值
- 返回一个指向当前分割出的字符串的指针。如果
*stringp
是 NULL,则返回 NULL。
实例
#include <stdio.h>
#include <string.h>
int main() {
char text[] = "apple,banana,cherry";
char *token;
char *saveptr;
// saveptr 用于存储 text 的原始地址,以便 strsep 更新 text 指针
saveptr = text;
// 循环分割字符串
while ((token = strsep(&saveptr, ",")) != NULL) {
printf("%s\n", token);
}
return 0;
}
结果
apple
banana
cherry
strdup函数
声明
char *strdup(const char *s);
描述
strdup
函数用于创建一个新的字符串,该字符串是参数 s
所指向的字符串的一个副本(包括终止的空字符 ‘\0’)。分配给新字符串的内存来自于 malloc
,因此,调用者负责在适当的时候使用 free
来释放这块内存,以避免内存泄漏。
参数
const char *s
:指向要复制的源字符串的指针。
返回值
- 返回一个指向新分配的字符串的指针,该字符串是
s
的副本。如果内存分配失败,则返回 NULL。
实例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
const char *original = "Hello, World!";
char *copy;
// 使用 strdup 复制字符串
copy = strdup(original);
if (copy != NULL) {
printf("Original: %s\n", original);
printf("Copy: %s\n", copy);
// 使用完毕后释放内存
free(copy);
} else {
printf("Memory allocation failed!\n");
}
return 0;
}
结果
Original: Hello, World!
Copy: Hello, World!
memcpy函数
声明
void *memcpy(void *str1, const void *str2, size_t n)
描述
从存储区 str2 复制 n 个字节到存储区 str1。
参数
- str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
- str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
- n – 要被复制的字节数。
返回值
该函数返回一个指向目标存储区 str1 的指针。
实例
// 将字符串复制到数组 dest 中
#include <stdio.h>
#include <string.h>
int main ()
{
const char src[50] = "http://www.runoob.com";
char dest[50];
memcpy(dest, src, strlen(src)+1);
printf("dest = %s\n", dest);
return(0);
}
结果
dest = http://www.runoob.com
memmove函数
声明
void *memmove(void *str1, const void *str2, size_t n)
描述
从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。
参数
- str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
- str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
- n – 要被复制的字节数。
返回值
该函数返回一个指向目标存储区 str1 的指针。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
const char dest[] = "oldstring";
const char src[] = "newstring";
printf("Before memmove dest = %s, src = %s\n", dest, src);
memmove(dest, src, 9);
printf("After memmove dest = %s, src = %s\n", dest, src);
return(0);
}
结果
Before memmove dest = oldstring, src = newstring
After memmove dest = newstring, src = newstring
memcmp函数
声明
int memcmp(const void *str1, const void *str2, size_t n)
描述
把存储区 str1 和存储区 str2 的前 n 个字节进行比较。
参数
- str1 – 指向内存块的指针。
- str2 – 指向内存块的指针。
- n – 要被比较的字节数。
返回值
- 如果返回值 < 0,则表示 str1 小于 str2。
- 如果返回值 > 0,则表示 str1 大于 str2。
- 如果返回值 = 0,则表示 str1 等于 str2。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[15];
char str2[15];
int ret;
memcpy(str1, "abcdef", 6);
memcpy(str2, "ABCDEF", 6);
ret = memcmp(str1, str2, 5);
if(ret > 0)
{
printf("str2 小于 str1");
}
else if(ret < 0)
{
printf("str1 小于 str2");
}
else
{
printf("str1 等于 str2");
}
return(0);
}
结果
str2 小于 str1
memchr函数
声明
void *memchr(const void *str, int c, size_t n)
描述
在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
参数
- str – 指向要执行搜索的内存块。
- c – 以 int 形式传递的值,但是函数在每次字节搜索时是使用该值的无符号字符形式。
- n – 要被分析的字节数。
返回值
该函数返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回 NULL。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
const char str[] = "http://www.runoob.com";
const char ch = '.';
char *ret;
ret = (char*)memchr(str, ch, strlen(str));
printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
return(0);
}
结果
|.| 之后的字符串是 - |.runoob.com|
memset函数
声明
void *memset(void *str, int c, size_t n)
描述
用于将一段内存区域设置为指定的值。
memset() 函数将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中,这可以用于将内存块清零或设置为特定值。
在一些情况下,需要快速初始化大块内存为零或者特定值,memset() 可以提供高效的实现。
在清空内存区域或者为内存区域赋值时,memset() 是一个常用的工具函数。
参数
- str – 指向要填充的内存区域的指针。
- c – 要设置的值,通常是一个无符号字符。
- n – 要被设置为该值的字节数。
返回值
该值返回一个指向存储区 str 的指针。
注意事项
memset()
并不对指针ptr
指向的内存区域做边界检查,因此使用时需要确保ptr
指向的内存区域足够大,避免发生越界访问。memset()
的第二个参数value
通常是一个int
类型的值,但实际上只使用了该值的低8位。这意味着在范围0
到255
之外的其他值可能会产生未定义的行为。num
参数表示要设置的字节数,通常是通过sizeof()
或其他手段计算得到的。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
char str[50];
strcpy(str,"This is string.h library function");
puts(str);
memset(str,'$',7);
puts(str);
return(0);
}
结果
This is string.h library function
$$$$$$$ string.h library function
总结
工作之余总结的笔记难免可能有些错误,如果有问题可以留言我改正。有遇到新的字符串处理函数我也会抽空添加。end