加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

字符串操作

发布时间:2020-12-16 09:09:31 所属栏目:百科 来源:网络整理
导读:原文链接:http://www.orlion.ga/932/ ? 1、初始化字符串 #include?string.hvoid?*memset(void?*s,?int?c,?size_t?n); ????memset函数把s所指的内存地址开始的n个字节都填充为c的值。通常c的值为0,把一块内存区域清零,例如定义char buf[10];,如果它是全局

原文链接:http://www.orlion.ga/932/

?1、初始化字符串

#include?<string.h>
void?*memset(void?*s,?int?c,?size_t?n);

????memset函数把s所指的内存地址开始的n个字节都填充为c的值。通常c的值为0,把一块内存区域清零,例如定义char buf[10];,如果它是全局变量或静态变量,则自动初始化为0(位于.bss段),如果它是函数的局部变量,则初值不确定,可以用memset(buf,10)清零,由malloc分配的内存初值也是不确定的,也可以用memset清零。

????2、取字符串的长度

#include?<string.h>
size?t?strlen(const?char?*s);

????strlen函数返回s所指的字符串的长度,返回的长度不包括''在内。要注意:如定义char buf[5] = "hello";,则调用strlen(buf)是危险的会造成数组访问过界。

????3、拷贝字符串

#include?<string.h>
void?*memcpy(void?*dest,?const?void?*src,?size_t?n);
void?*memmove(void?*dest,?size_t?n);
返回值:dest指向哪,返回的指针就指向哪

????memcpy函数从src所指的内存地址拷贝n个字节到dest所指的内存地址,和strncpy不同,memcpy并不是遇到''就结束,而是一定会拷贝完n个字节。这里的命名规律是,以str开头的函数处理以''结尾的字符串,而以mem开头的函数则不关心'o',这些函数并不把参数当字符串看待,因此参数的指针是类型是void *而不是char *;

????memmove是从src所指的内存地址拷贝n个字节到dest所指的内存地址,虽然叫move但其实也是拷贝而不是移动。与mencpy不同的是memcpy的两个参数src和dest所指的内存区间如果重叠则无法保证正确拷贝,而memmove却可以正确拷贝。

????4、连接字符串

#include?<string.h>

char?*strcat(char?*dest,?const?char?*src);
char?*strncat(char?*dest,?const?char?*src,1); -webkit-text-stroke-width: 0px'>????strcat把src所指的字符串连接到dest所指的字符串后面,例如:

char?d[10]?=?"foo";
char?s[10]?=?"bar";
strcat(d,?s);
printf("%s?%sn",?d,?s);

????调用strcat函数后,缓冲区s的内容没变,缓冲区d中保存着字符串"foobar",注意原来"foo"后面的''被连接上来的字符串"bar"覆盖掉了,"bar"后面的''仍保留。

????strcat和strcpy有同样的问题,调用者必须确保dest缓冲区足够大,否则会导致缓冲区溢出错误。strncat函数通过参数n指定一个长度,就可以避免缓冲区溢出错误。n表示最多从src缓冲区取n个字符(不包括结尾的'')。如果src中前n个字符没有出现''则取前n个字符再加一个''连接到dest后面。strncpy并不保证dest缓冲区以''结束。

????5、比较字符串

#include?<string.h>

int?memcmp(const?void?*s1,?const?void?*s2,?size_t?n);
int?strcmp(const?char?*s1,?const?char?*s2);
int?strncmp(const?char?*s1,?const?char?*s2,?size_t?n);
返回值:负值表示s1小于s2,0表示s1等于s2,正值表示s1大于s2

????memcmp从前到后逐个比较缓冲区s1和s2的前n个字符(不管里面有没有''),如果s1和s2的前n个字节全都一样返回0,如果遇到不一样的字节,s1的字节比s2小就返回负值,s1的字节比s2大就返回正值。

????strcmp把s1和s2当字符串比较,在其中一个字符串中遇到''时结束,"ABC"比"abc"大,"ABCD"比"ABC"大,"123A9"比"123B2"小。

????strncmp的比较结束条件时:要么在其中一个字符串中遇到''结束(类似于strcmp),要么比较完n个字符结束(类似memcmp)。例如strncmp("ABCD","ABC",3)返回值0。strncamp("ABCD",4)的返回值是正值。

#include?<string.h>

int?strcasecmp(const?char?*s1,?const?char?*s2);
int?strncasecmp(const?char?*s1,?size_t?b);

????6、搜索字符串

#include?<string.h>

char?*strchr(const?char?*s,?int?c);
char?*strrchr(const?char?*s,?int?c);
返回值:如果找到字符c,返回字符串s中指向字符串c的指针,如果找不到就返回NULL

????strchr在字符串s中从前到后查找字符c,找到字符c第一出线的位置时就返回,返回值指向这个位置,如果找不到c就返回NULL。strrchr和strchr类似,但是是从右向左找,找到字符c第一次出现的位置就返回。

#include?<string.h>

char?*strstr(const?char?*haystack,?const?char?*needle);
返回值:如果找到子串,返回值指向子串的开头,如果找不到返回NULL

? ? strstr在一个长字符串中从前到后找一个子串(Substring),找到子串第一次出现的位置就返回,返回值指向子串的开头,如果找不到就返回NULL。

????7、分割字符串

#include?<string.h>

char?*strtok(char?*str,?const?char?*delim);
char?*strtok_r(char?*str,?const?char?*delim,?char?**saveptr);
返回值:返回指向下一个Token的指针,如果没有下一个Token了就返回NULL

????参数str是待分割的字符串,delim是分隔符,可以指定一个或多个分隔符,strtok遇到其中任何一个分隔符就会分割字符串。(Token:分割出来的每一段字符串称为一个Token)

?

注:测试过程中发生了段错误:char *s? = "abc"; memset(s,...);这种写法,实际是分配了一块字符常量,其内容是不能被修改的,所以会段错误!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读