嵌入式学习-c语言字符串处理函数

字符串处理函数头文件

在c语言程序中要想使用字符串处理函数,就需要加头文件 #include<string.h>

常见的字符串处理函数

① 求字符串长度的函数strlen
② 字符串拷贝函数strcpy
③ 字符串连接函数strcat
④ 字符串比较函数strcmp
⑤ 字符串分解函数strtok

strlen函数

在C语言中,strlen() 是一个库函数,用于计算字符串的长度,即字符串中字符的数量(不包括结尾的空字符 \0)。

strlen() 函数的函数原型如下:

size_t strlen(const char* str);

函数接受一个参数 str,表示要计算长度的字符串。

实例:

	char jsch[] = {'v','\0','c','b','\0','a'};
	char tsch[] = "t\t\a\b\\bb";
	char tsch1[] = "\x69\141\n";
	printf("%s的长度为%d\n",jsch,strlen(jsch));
	printf("%s的长度为%d,用公式为%d\n",tsch,strlen(tsch),sizeof(tsch)/sizeof(char));
	printf("%s的长度为%d\n",tsch1,strlen(tsch1));

输出:

v的长度为1
t      \bb的长度为7,用公式为8
ia
的长度为3

从这个例子可以看出字符串就是一遇到’\0’就结束了,且strlen函数也不会计算’\0’,同时特殊字符\t\a\b等,每个字符带上\总共占一个长度,且像转义序列\x69和\141这样的,每个序列占一个字符长度

strcpy函数

要用这个函数,首先参数一定得是字符串才行。
在C语言中,strcpy() 是一个用于字符串复制的库函数,用于将一个字符串拷贝到另一个字符串中。它的函数原型如下:

char* strcpy(char* destination, const char* source);

函数接受两个参数:destinationsource,分别表示目标字符串源字符串。这个函数的返回值目标字符串的首地址

strcpy() 的作用是将源字符串中的内容复制到目标字符串中请务必注意这里的复制顺序,先写目标字符串),包括字符串的结束标志 \0它会从源字符串的起始位置开始复制,直到遇到结束标志 \0。注意,目标字符串必须足够大,以容纳源字符串的内容,否则可能导致缓冲区溢出的安全问题。

下面是一个使用 strcpy() 的示例:

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, World!";
    char destination[20];

    strcpy(destination, source);

    printf("目标字符串是:%s\n", destination);

    return 0;
}

在上述示例中,我们声明了 source 字符数组作为源字符串,包含了 “Hello, World!”。然后,我们声明了 destination 字符数组作为目标字符串,长度为 20。通过调用 strcpy(destination, source) 将 source 中的内容复制到 destination 中。

最后,我们打印输出 destination 字符串,结果应该是 “Hello, World!”。

如果不用这个函数进行拷贝字符串,那么只能通过循环一个一个字符的复制到新字符串里,而不能直接 数组名 = 数组名 这样赋值。

strcat函数

同样,这个函数的前提是参数必须是字符串
假如输入的参数不是字符串,那么输出结果就不受控制了。
在这里插入图片描述

在这里插入图片描述

在C语言中,strcat()是一个字符串拼接函数,用于将源字符串连接到目标字符串的末尾。

strcat()函数的函数原型如下:

char* strcat(char* destination, const char* source);

函数接受两个参数:destination和source,分别表示目标字符串和源字符串。这个函数的返回值目标字符串的首地址

strcat()函数会将源字符串中的字符依次拼接到目标字符串的末尾,直到遇到源字符串的结束标志\0。拼接后的目标字符串仍然以\0结尾。
在这里插入图片描述

下面是使用strcat()函数的示例:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[30] = "Hello";
    char str2[] = " World!";

    strcat(str1, str2);

    printf("拼接后的字符串是:%s\n", str1);

    return 0;
}

在上述示例中,我们声明了一个目标字符串str1,内容是"Hello",并且声明了一个源字符串str2,内容是" World!"。通过调用strcat(str1, str2),将str2拼接到str1的末尾。

最后,我们打印输出拼接后的字符串,结果应该是"Hello World!"。

strcmp函数

strcmp()是C语言中的一个库函数,用于比较两个字符串的大小。
注意如果两个字符串的长度不一致,那么在比较完已有字符部分后还会比较’\0’字符,也就是字符串的结束字符。
strcmp()函数的函数原型如下:

int strcmp(const char* str1, const char* str2);

函数接受两个参数:str1和str2,分别表示要进行比较的两个字符串。

strcmp()函数会按照字典顺序逐个比较两个字符串中的字符,直到:

遇到不同的字符,则返回比较字符的差值(ASCII码差值)。注意这里不是比较字符长度,而是比较ASCII码的大小。
遇到字符串结束标志\0,则返回0,表示两个字符串相等。
返回值意义的示例:

如果返回值小于0,表示str1小于str2。
如果返回值大于0,表示str1大于str2。
如果返回值等于0,表示str1等于str2。

下面是使用strcmp()函数的示例:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "apple";
    char str2[] = "banana";
    char str3[] = "apple";

    int result1 = strcmp(str1, str2);
    int result2 = strcmp(str1, str3);

    printf("result1: %d\n", result1);
    printf("result2: %d\n", result2);

    return 0;
}

在上述示例中,我们通过调用strcmp()函数来比较字符串。result1存储了比较str1和str2的结果,result2存储了比较str1和str3的结果。

最后,我们打印输出比较结果。

运行上述示例,结果应该是:

result1: -1
result2: 0

这是因为"apple"在字典顺序中小于"banana",所以result1为-1;而"apple"和"apple"相等,所以result2为0。

strncpy(p,p1,n)

复制指定长度字符串

#include<stdio.h>
#include<string.h>

int main(){
	char src[] = "srcsrcsrc";
	char det[20];
	strncpy(det,src,3);
	det[3] = '\0';//手动添加'\0'
	printf("复制了3个字符到det里:%s",det);
	return 0;
}

这个例子是把src字符串的前三个字符复制给det数组,但由于前三个字符不包含’\0’,以及一般用这个函数都不包含’\0’,所以一般都需要手动添加’\0’,否则就会输出乱码或者随机值导致结果错误。

在这里插入图片描述
这个例子是在另一个字符串也有值的情况下进行复制,src的前四位复制到dest里后覆盖了dest的前四位最后被打印出来,需要注意的是这里覆盖的情况

strncat(p,p1,n)

附加指定长度字符串

//此时det数组为"src"
 char array[] = "abcde";
    strncat(array,det,1);
	printf("连接了一个s到abcde后面:%s",array);

输出结果:

连接了一个s到abcde后面:abcdes

strcasecmp

忽略大小写比较字符串

char arr[] = "abc";
	char arr1[] = "ABC";
	printf("测试是否忽略大小写比较:%d\n",strcasecmp(arr,arr1));

输出结果:

测试是否忽略大小写比较:0

strncmp(p,p1,n)

比较指定长度字符串

char arr[] = "ABc";
char arr1[] = "ABC";
printf("%s和%s的五位数比较:%d\n",arr,arr1,strncmp(arr,arr1,2));

输出结果为:

ABc和ABC的两位数比较:0

strchr(p,c)

在字符串中查找指定字符
strchr是C语言中的一个字符串操作函数,用于在一个字符串中查找某个字符的出现位置。它的函数原型如下:

char *strchr(const char *str, int character);

该函数接受两个参数,str是要进行查找的字符串,character是要查找的目标字符的ASCII码值。(注意后面的参数是int类型

strchr函数返回目标字符在源字符串中的第一个匹配位置的指针(可以用%p接收)。如果目标字符未在源字符串中找到,则返回NULL。
如果想要反向查找(也就是查找最后一次出现的字符),那么只需要用strrchr函数即可,即在中间加一个’r’。

char arr[] = "ABc";
int c = 'B';
printf("起始地址:%p,在%s中查找B的结果是:%p\n",arr,arr,strchr(arr,c));
printf("在%s中查找B的结果用下标表示为:%d",arr,strchr(arr,c)-arr);

输出结果:

起始地址:0xbf89a6d9,在ABc中查找B的结果是:0xbf89a6da
在ABc中查找B的结果用下标表示为:1

可以看出,利用这个函数可以让要查找字符的位置以严格的十六进制输出,也可以通过和字符串起始地址相减得到要查找字符的下标。

strstr(p,p1)

strstr是C语言中的一个字符串操作函数,用于在一个字符串中查找另一个子串的出现位置。它的函数原型如下:

char *strstr(const char *haystack, const char *needle);

该函数接受两个参数,haystack是要进行查找的字符串,needle是要查找的目标子串。(注意这里后面也是char类型,和查找单个字符不同)

strstr函数返回目标子串第一次出现在源字符串中的位置的指针。如果目标子串未在源字符串中找到,则返回NULL。

char array1[] = "ABCDE";
char arr1[] = "ABC";

printf("起始地址:%p,在%s中查找%s的结果是:%p\n",array1,array1,arr1,strstr(array1,arr1));

输出结果:

起始地址:0xbfb701b1,在ABCDE中查找ABC的结果是:0xbfb701b1

可见,strstr函数返回的是ABC在ABCDE中第一次出现的位置

isalpha函数

检查是否为字母字符
使用时需加入头文件 #include<ctype.h>

strtok函数

strtok是C语言中的一个字符串处理函数,用于将字符串拆分成一个个标记(token)。

该函数定义在<string.h>头文件中。strtok函数的原型如下:

char *strtok(char *str, const char *delim);

函数接受两个参数:

  • str:要拆分的字符串,第一次调用时传入原始字符串,后续调用传入NULL
  • delim:用于指定拆分字符串的分隔符字符集合。

strtok函数的工作过程如下:

  1. 第一次调用时,将原始字符串作为参数传入str,并返回第一个标记。
  2. 后续的调用中,将参数NULL传入str,函数将继续从上次停止的位置继续拆分字符串,并返回下一个标记。
  3. 如果在拆分过程中未找到更多标记,则返回NULL

strtok函数根据指定的分隔符将字符串拆分成一个个标记,并使用内部的静态变量来记录拆分的状态。每次调用函数时,它会从上次停止的位置继续拆分。

以下是一个使用strtok函数将字符串拆分为多个标记的示例:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Apple, Banana, Orange, Mango";
    const char *delim = ", ";
    char *token = strtok(str, delim);

    while (token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, delim);
    }

    return 0;
}

在这个示例中,我们将字符串"Apple, Banana, Orange, Mango"按照逗号和空格作为分隔符进行拆分。我们首先使用strtok函数将第一个标记获取回来,然后在循环中不断使用strtok(NULL, delim)来获取下一个标记,直到没有更多标记为止。

输出结果将会是:

Apple
Banana
Orange
Mango

需要注意的是,在使用strtok函数时,原始字符串会被修改。如果需要保留原始字符串,建议先创建其副本进行操作。此外,当字符串中存在连续的分隔符时,strtok会将连续的分隔符视为一个分隔符处理,拆分时会跳过空的标记。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值