【C】第5天 认识一揽子字符串函数

字符串函数 String Function

C语言自带的头文件string.h中包含了一些常用字符串函数原型,合理利用它们将有助于弥补C在字符串处理方面的不足。

STR-FUNC-1 检查字符串长度的strlen()

库函数strlen()的函数原型:

size_t strlen(char const *string)

它接受一个指向字符串起始位置的指针,再返回其长度。
注意到此处strlen()的返回值类型是size_t,这不是C的基本数据类型,它在头文件stddef.h中被定义。只需要将其看作是无符号整数unsigned int进行使用即可。


STR-FUNC-2 复制与连接

对于在多个字符串上进行操作,我们常常需要复制一个字符串到另一处:使用strcpy()。(函数名是 string copy 的简写)

char *strcpy(char *dst,const char *src);//它的返回值是dst的一个副本

src是指向源字符串的指针,该函数进行复制并包含结尾的\0。因此dst位置的内容将会被覆盖或不再可以访问。

strcpy的一大缺陷是它无法得知源字符串能否被放入dst中。如果dst中的可用空间太少,其结果是未定义的,所以一定要保证dst位置由足够存放的空间。

如果实在无法确定src的长度,可以使用更加安全的strncpy(),它额外接受一个无符号整数用于限制其最大复制长度。

char *strncpy(char *dst,const char *src,size_t len);

size_t len规定了最大复制字符的数量,包括其中的\0。如果src处的字符串中字符个数少于这个值,剩余的空位将会以\0自动填充。注意:如果src处的字符串中字符个数多于这个值,只有一部分会被复制,而更糟的是极可能得到一个不含结尾\0的字符串。

如前所述,复制字符串将覆盖原有的内容。除此之外我们还能用strcat()来连接一个字符串到另一个的结尾。

char *strcat(char *dst,const char *src);//它的返回值是dst的一个副本

strcat()将会先找到dst处字符串的末尾\0,再进行一次复制src的操作。

长度受限的版本:

char *strncat(char *dst,const char *src,size_t len);

STR-FUNC-3 字符串比较

字符串是由char组成的。那么应该如何比较两个字符串的“大小”?
下面请看strcmp()的原型:

int strcmp(char const *s1,char const *s2);

s1s2是两个将进行比较的字符串,strcmp()函数会查找它们其中第一个不一样的字符,然后根据字符的字符集序数进行比较,并且只会比较这一个字符就输出结果。如果前者s1小于后者s2,则返回一个小于0的值;前者大于后者,则返回一个大于0的值;相等时返回0。

实际上,这个函数最经常见到的用处是判断两个字符串是否相等。


STR-FUNC-4 在字符串中查找

strchr()strrchr()查找一个匹配的字符

char *strchr(char const *str,int ch);
char *strrchr(char const *str,int ch);

ch即为需要在str中查找的目标字符。有趣的是chint型,但只需要向它传递一个字符即可。
返回值是一个指向第一个匹配目标字符的指针。如果未找到则返回NULL

strrchr()函数原型相同,但它的返回值是指向字符串中最后一个出现的匹配目标字符的指针。


strpbrk()则是在一个字符集合中查找目标字符

char *strpbrk(char const *str,char const *group);

返回值是指向第一个在集合中出现的字符指针。如果未找到,返回值是NULL


strstr()在一个字符串中查找另一个字符串(又叫子串)

char *strstr(char const *str,char const *s);

这个函数将在str中查找s第一次完整出现的位置,并返回指向第一次出现的起始位置的指针。如果s未完整出现则返回NULL,如果s是空字符串则返回str本身。


**strspnstrcspn会对字符串前面的一部分进行计数。**依托于一个字符集合,从字符串开头处计数匹配目标字符集合的字符,直到遇到第一个不匹配的字符为止,返回起始部分的对应字符数量。

size_t strspn(char const *str,char const *group);
size_t strcspn(char const *str,char const *group);

strspn()返回str起始部分匹配group中任意字符的字符数量。
恰恰相反,strcspn()返回的是起始部分不匹配group的部分。遇到相匹配的字符时,会停止计数。


strtok()函数的用法比较抽象,它的作用是“分割”一个字符串。
在哪里进行分割?sep参数会给出用作分隔符的字符集合。

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

函数从str开始查找sep中包含的分隔符,直到在str字符串中遇到sep中任意一个分隔符,将其修改(会修改str,这也是为何此处str形参并没有作为const量)为一个\0,然后返回一个指向已经分割好的子字符串的指针。

**与此同时strtok()函数会立即存储此字符串中改变了的位置。**在此之后,如果想要继续对str的后续部分进行分割,只需要向此函数的第一个形参传递一个NULL即可继续在str后面进行分割。

str中所有内容都已经被分割了,函数的返回值将变为NULL,以表示它已经无事可做。例如:

token = strtok(str, delimiters);  //先获取一个子字符串,并使strtok保存分割了的位置
  
    // 继续获取其他子字符串  
    while( token != NULL ) {  
        printf( " %s\n", token );  
  
        // 注意:这里需要传递 NULL 来获取下一个子字符串  
        token = strtok(NULL, delimiters);  
    }  


一揽子名字奇奇怪怪的这些函数我也记不住啊,明天争取再写一个函数应用篇吧

本系列博客为我本人原创的学习笔记,尽量勤更新,如有错误欢迎各位大佬指出,Thanks♪(・ω・)ノ

  • 24
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值