字符串处理函数---很重要

1.字符串的定义:
字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。因此,字符串所包含的字符内部不能出现NUL字节。
2.头文件包含:
头文件string.h中包含了使用字符串函数所需要的原型和声明。

3.字符串长度
字符串长度就是所包含的字符的个数。
库函数Strlen函数的原型如下:
size_t strlen (char const * string)
注意:strlen返回的是一个类型为size_t的值,这个类型是在头文件stddef.h中定义的,它是一个无符号整数类型。

4.不受限制的字符串函数
不受限制的字符串函数就是说他们只是通过寻找字符串参数末尾的NUL(也就是\0)字节来判断它的长度。这些函数一般都是指定一块内存用于存放结果字符串。在使用这些函数时,程序员必须保证结果字符串不会溢出这块内存。

strcpy():拷贝字符串
函数原型 char *strcpy(char *dst, char const *src))
解读:将src中的字符串拷贝到dst中去。程序员要去报dst的空间足够大,能够存储下src中的内容。即使src中的内容少于dst中的内容,dst字符串中新的内容也只有src.因为字符串是以\0结尾的。到\0后老字符串中最后剩余的几个字符也会被有效的删除。

返回值:是它们第一个参数的一份拷贝,就是一个指向目标字符串数组的指针。

strcat():连接字符串
函数原型 char *strcat(char *dst, char const *src)
解读:就是把一个字符串添加到另一个字符串的结尾。此函数要求dst参数原先已经包含一个字符串(可以是空字符串)。它找到字符串的结尾,并把src字符串的一份拷贝添加到这个位置。如果src和dst的位置发生重叠,其结果是未定义的。和strcpy一样,要确保dst的空间足够大。

返回值:是它们第一个参数的一份拷贝,就是一个指向目标字符串数组的指针。

strcmp():比较字符串
函数原型:int strcmp(char const *s1, char const *s2)

解读:就是字符串s1和字符串s2每一个字符挨个比较是否相同,直到发现不匹配为止。那个最先不匹配的字符中较“小”(就是说ASCII码标准字符所对应的十进制数的大小)。如果s1小于s2,函数返回一个小于零的值,如果s1大于s2,函数返回一个大于零的值。如果两个字符串相等,函数就返回零。

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

int main()
{
    char str1[] = "ChinaNB!";
    char str2[] = "chinaNB!";
    int a = 0;
    a = strcmp(str1,str2); 
   //因为小写字符‘c’所对应的十进制数为97,大写字符‘C’所对应的十进制数为65。
    printf("a = %d\n",a);
    printf("Hello world!\n");
    return 0;
}

在这里插入图片描述
——————————————————————————
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   char str1[] = "ChinaNB!";
   char str2[] = "chinaNB!";
   int a = 0;
   a = strcmp(str2,str1);  
   //比较字符串中的第一个字符串大于第二个字符串,返回一个大于零的数
   printf("a = %d\n",a);
   printf("Hello world!\n");
   return 0;
}

在这里插入图片描述
——————————————————————————
字符串相等的情况:
在这里插入图片描述

5.长度受限的字符串函数

strncpy():复制字符串
函数原型 char *strcpy(char *dst, char const *src ,size_t len)
解读:strncpy()函数的功能同strcpy()一样,都是把源字符串复制到目标字符数组。然而它总是正好向dst写入len个字符。如果Strlen(src)的值小于len,dst数组就用额外的NUL填充到len长度。如果strlen(src)的值大于或等于len,那么只有len个字符被复制到dst中!**注意:它的结果将不会以NUL字节结尾。**也就是说有可能strncpy的结果不是一个字符串。

strncat():拼接字符串
函数原型 char *strncat(char *dst, char const *src ,size_t len)

解读:strncat()和strcat()的功能一样。但是它从src中最多复制len个字符到目标数组的后边。但是strcat总是在结果字符后边添加一个NUL字节。strncat最多想目标数组复制len个字符(再加一个结尾的NUL字节),它才不管目标参数除去原先存在的字符串之后留下的空间够不够。

strncmp():比较字符串
函数原型 char *strncmp(char *dst, char const *src ,size_t len)

解读:strncmp也是用于比较两个字符串,但是它最多比较len个字节。如果两个字符串在第len个字符之前存在不相等的字符,这个函数就向strcmp一样停止,返回结果。如果两个字符串的前len个字符相等,函数就返回零。

6.查找一个字符

函数:

strchr() 和 strrchr()
函数原型:
char *strchar(char const *str, int ch);
char *strrchr(char const *str, int ch);
以上两个函数的功能基本相同:它们第二个参数都是一个整型值。但是,它包含一个字符值。strchr在字符串str中查找字符ch第一次出现的位置,找到后函数返回一个指向该位置的指针。如果该字符并不存在与字符串中,函数就返回一个NULL指针。
不同点:strrchr,只是它所返回的是一个指向字符串中该字符最后一次出现的位置。

7.查找任何几个字符
strpbrk是一个更为常见的函数。它并不是查找某个特定的字符,而是查找任何一组字符第1次在字符串中出现的位置。它的原型是:
char *strpbrk(char const *str, char const * group);
这个函数返回一个指向str中第1个匹配group中任何一个字符的字符位置。如果未找到匹配,函数返回NULL指针。

char string[] = "Hello there, honey";
char *ans;
ans = strpbrk(string, aeiou);
//ans所指向的位置是string+1,因为这个位置是第二个参数中的字符第一次出现的位置。

8.查找一个子串
函数strstr()
函数原型 char *strstr(char const *s1, char const s2)
解读:这个函数在s1中查找整个s2第一次出现的起始位置,并返回一个指向该位置的指针。如果s2并没有完整地出现在s1的任何地方,函数将返回一个NULL。如果第二个参数是一个空字符串,函数就返回s1.
——————————————————————————————————————————————
——————————————————————————————————————————————
9.高级字符串查找

查找一个字符串的前缀
strspan和strcspan函数用于在字符串的起始位置对字符计数。它们的原型如下:
size_t strspan( char const *str ,char const * group)

group字符串指定一个或多个字符。strspan返回str起始部分匹配group中任意字符的字符数。说白了就是:从str起始位置开始,跟group对比,从str的起始位置开始连续几个跟group相符。

size_t strcspan( char const *str ,char const * group)

strcspan和strspan正好相反。

group字符串指定一个或多个字符。strspan返回str起始部分匹配group中任意字符的字符数。说白了就是:从str起始位置开始,跟group对比,从str的起始位置开始连续几个不跟group相符。
strpan函数和strspan函数详解(解释的更加清楚)

10.查找标记
函数原型:
char * strtok( char *str , char const *step);

step参数是个字符串,定义了用作分隔符的字符集合。第一个参数指定一个字符串,它包含零个或者多个step字符串中一个或多个分隔符分割的标记。strtok找到str的下一个标记,并将其用NULL结尾,然后返回一个指向这个标记的指针。

strtok()函数详解!

通过三个例子来理解。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
11.字符操作
标准库包含了两组函数,用于操作单独的字符,它们的原型位于头文件ctype.h。第一组函数用于对字符分类,而第二组函数用于转换字符。

11.1字符分类
在这里插入图片描述

11.2字符转换
转换函数把大写字母转换为小写字母或者小写字母转换为大写字母
int tolower( int ch) //返回参数对应其小写形式
int toupper(int ch) //返回的参数是对应大写形式

以上两个函数,参数如果不是大写或者小写(不是合适的参数),函数将不修改参数直接返回。

12.内存操作
根据定义,字符串中由一个NUL字节结尾,所以字符串内部不能包含任何NUL字符。但是非字符串数据内部包含零值的情况并不罕见。所以我们就没有办法通过str系列的字符串处理函数来完整的处理。因为会在遇到第一个NUL字节就会停止。
所以:它们上场了:

函数原型:

void * memcpy(void * dst , void const *src ,size_t length)  //复制
void * memmove(void * dst , void const *src ,size_t length)//
void * memcmp(void * dst , void const *src ,size_t length)
void * memset(void * dst , void const *src ,size_t length)

每个函数都包含一个显式的参数说明需要处理几个字节数。它们与str系列的函数不同的是,如果处理的字节数还不到length的时候遇到了NUL并不会停止操作。

解读:
memcpy()和memmove()都是内存拷贝。
memcpy()函数就是把src中的length个字节复制到dst中去。
memmove()和memcpy()实现的功能差不多,区别就在于,memmove()函数的源和目标操作数可以重叠。这个函数的实现方法是:先将src中的内容复制到一个临时变量中,然后将临时变量中的内容再复制到dst中。不明白的可以看下边这篇文章,很清晰。

memcpy()和memmove()的区别详解

memcmp()对两段内存的内容进行比较,这两段内存分别起始于a和b,工比较length个字节。这些值按照无符号字逐字节比较,函数的返回类型和strcmp函数一样------负值表示a小于b,正值表示a大于b,零表示a等于b。这些数是无符号的字节进行比较的。所以如果memcmp函数用于比较不是单字节的数据如整数或者浮点数时返回结果是不可预测的。

memchr从a的起始位置开始查找字符ch第一次出现的位置,并返回一个指向该位置的指针,它工查找length个字节。如果没有查找到,函数就返回NULL指针。

memset()函数把从a开始的length个字节都设置为字符值ch.例如:

memset(buffer, 0 ,size);//把buffer的前size个字节都初始化为0.

13.strstr()函数
就是查找字符串。
在调试GSM模块时用到了这个函数,检查GSM模块中是否返回了字符串“OK”。还是很好用的。
函数原型:
char *strstr(const char *haystack, const char *needle)
在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 ‘\0’。如果没有查找到就返回NULL指针。

参考文章:
strstr(str1,str2) 函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值