本文主要是介绍「C/C++ 01」C标准库中常见的字符串处理函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
1、strlen()
2、strcpy()、strncpy()
3、strstr()
4、strcmp()、strncmp()
5、strcat()、strncat()(效率比 strcpy() 低)
6、strtok()
7、memset()
以下函数都在头文件#include<string.h>中
1、strlen()
strlen()函数和sizeof运算符 的区别:strlen()不算\0,sizeof()会算,一个是函数,一个是运算符。
2、strcpy()、strncpy()
#include <string.h>char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
函数说明:
(1)strcpy()函数将src指向的字符串(包括终止的空字节('\0'))复制到dest指向的buffer中,字符串不能重叠,而且目标字符串dest必须足够大。
(2)strncpy()函数与strcpy()类似,不同之处是可以指定最多复制src的前n个字节(如果在src的前n个字节中没有null,则放在dest中的字符串不会以0结尾)。
3、strstr()
用来查找子串。找到了返回开头的指针,没找到则返回NULL。
#include <string.h>char *strstr(const char *a, const char *b);
函数说明:
strstr()函数在a指向的字符串中查找第一个出现的子字符串b。不比较终止字符Null字节('\0')。这些函数返回指向所定位子字符串开头的指针,如果没找到对应的子字符串,则返回NULL。
4、strcmp()、strncmp()
用来比较两个字符串,相同返回0,s1 > s2返回1,s1 < s2返回-1;
#include <string.h>int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
函数说明:
(1)strcmp()用于比较两个字符串s1和s2。逐个字符去比较ASCII码,比较出大小时返回。一旦比较出不同,就会立即返回。返回值如下:
如果s1指向的字符串 = s2指向的字符串 返回 0
如果s1指向的字符串 > s2指向的字符串 返回 正数
如果s1指向的字符串 < s2指向的字符串 返回 负数
(2)strncmp()比较s1和s2指向的字符串中的前n个字符,比较方法与strcmp()类似。
5、strcat()、strncat()(效率比 strcpy() 低)
尾插:将字符串s2尾插到s1的‘\0’处,结束再加上一个'\0'
#include <string.h>char *strcat(char *s1, const char *s2);
char *strncat(char *s1, const char *s2, size_t n);
函数说明:
(1) strcat()函数将src字符串添加到dest字符串中,覆盖了在位置结束的空字节('\0')
dest的末尾,然后添加一个终止空字节。返回值是指向dest的指针。(2)strncat()函数与strcat()函数类似,至少strncat()可以指定最多来自src的前n个字节。
6、strtok()
用来拆分字符串,建议自己写一个更好用。
#include <string.h>char *strtok(char *str, const char *delim);
函数说明:
strtok() 将字符串分解为零或多个非空标记的序列。str是要解析的字符串,在第一次调用strtok()时,必须要指定str。之后调用该函数想继续解析该字符串,str必须为NULL。
#include <stdio.h>
#include <string.h>int main(int argc,char *argv[])
{char *token;char str[] = "hello-world-I-am-a-person-of-harding-to-learn-code";token = strtok(str,"-");while( NULL != token ){ printf("string:%s\n",token);token = strtok(NULL,"-");}return 0;
}
7、memset()
用来初始化指针指向的内存空间。
#include <string.h>void *memset(void *s, int c, size_t n);
常用的写法有三个:
memset(arr, 0, sizeof arr);
memset(arr, -1, sizeof arr);
memset(arr, 0x3f, sizeof arr);
注意:
为地址s开始的n个字节赋值c,注意:是逐个字节赋值,str开始的n个字节中的每个字节都赋值为c。
(1) 若s指向char型地址,c可为任意字符值;
(2) 若s指向非char型,如int型地址,要想赋值正确,c的值只能是-1或0,因为-1和0转化成二进制后每一位都是一样的,设int型占4个字节,则-1=0XFFFFFFFF, 0=0X00000000。为什么c的值只能是-1或0 呢?
通过memset(a,100,sizeof a)给int类型的数组赋值,你给第一个字节的是一百,转成二进制就是0110 0100,而int有四个字节,也就是说,一个int被赋值为0110 0100,0110 0100,0110 0100,0110 0100,对应的十进制是1684300900,根本不是你想要赋的值100,这也就解释了为什么数组中的元素的值都为1684300900。
至于0x3f,这是编程竞赛中常用到的一个数值,0x3f3f3f3f约为10亿,差不多是int上限的一半,一般为编程竞赛中的最大值,在memset中使用0x3f,相当于把每四个字节即一个int数字初始化为0x3f3f3f3f。
------------------------END-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。
这篇关于「C/C++ 01」C标准库中常见的字符串处理函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!