目录
1、strlen()函数
2、strcpy()、strncpy()函数
3、strstr() 函数
4、strcmp()、strncmp()函数
5、strcat()、strncat()函数
6、strtok()函数
7、memset()函数
本篇文章为大家详细讲解C语言中常用的几种字符串处理函数及其用法,让我们一起来学习吧!
1、strlen()函数
函数原型:
#include <string.h>
size_t strlen(const char *s);
函数说明:
strlen()函数计算s指向的字符串的长度,不包括终止的null字节(' \ 0”)。strlen()函数返回s所指向的字符串的字节数。
代码演示:
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char str[] = "hello";
int len = 0;
len = strlen(str);
printf("len:%d\n", len); //正确结果:len = 5
return 0;
}
注意:
说起计算字符串长度的函数,大家一定还会想到sizeof函数,但大家一定要知道strlen()函数和sizeof()函数的区别!我接下来用代码给大家演示一下!
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
char str[1024] = "hello";
char std[] = "hello";
int len = 0;
len = strlen(str);
printf("len:%d\n",len); //正确结果:len=5
len = sizeof(str);
printf("len:%d\n",len); //正确结果:len=1024
len = strlen(std);
printf("len:%d\n",len); //正确结果:len=5
len = sizeof(std);
printf("len:%d\n",len); //正确结果:len=6
return 0;
}
为什么计算的字符串长度大小不一样呢?这是因为strle你()会从字符串的开头开始计算,直到遇到 null 字符为止,然后返回计数值。而sizeof()函数用于获取变量或类型所占用的内存字节数。对于字符数组,sizeof()返回数组的总大小。而计算字符串长度时,sizeof() 会将整个字符数组的大小计算进去,因此得到的值比strlen()返回的值大 1(因为 null 字符也算进去了)。
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结尾)。
代码演示:
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
char src[] = "hello";
char dest_1[15];
char dest_2[15];
strcpy(dest_1,src);
printf("dest_1:%s\n",dest_1); //打印结果:hello
strncpy(dest_2,src,3);
printf("dest_2:%s\n",dest_2); //打印结果:hel
return 0;
}
注意:
使用strcpy()函数进行字符串复制时,源字符串和目标字符串不能指向同一个内存区域。
3、strstr() 函数
函数原型:
#include <string.h>
char *strstr(const char *haystack, const char *needle);
函数说明:
strstr()函数在string haystack指向的字符串中查找第一个出现的子字符串needle。不比较终止字符Null字节('\0')。这些函数返回指向所定位子字符串开头的指针,如果没找到对应的子字符串,则返回NULL。
代码演示:
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
char src[] = "hello-world-how-are-you";
char *ptr;
ptr = strstr(src,"-");
printf("%s\n",ptr); //打印结果:-world-how-are-you
return 0;
}
4、strcmp()、strncmp()函数
函数原型:
#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()类似。
代码演示:
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
char src[] = "hello";
char srd[] = "hello";
char srp[] = "hel";
char srq[] = "hello world";
int rv = -1;
rv = strcmp(src,srd);
printf("rv:%d\n",rv); 正确结果:src和srd相等,所以rv=0
rv = strcmp(src,srp);
printf("rv:%d\n",rv); 正确结果:逐个字符比较,src比srp大l,找对应的ASCII码表,因为src>srp,所以rv=108
rv = strcmp(src,srq);
printf("rv:%d\n",rv); 正确结果:逐个字符比较,src比srq小 (空格),找对应的ASCII码表,因为src<srq,所以rv=-32
rv = strncmp(src,srq,5);
printf("rv:%d\n",rv); 正确结果:前五个字符,src和srq相等,所以rv=0
return 0;
}
ASCII表参考如下:
5、strcat()、strncat()函数
函数原型如下:
#include <string.h>
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
函数说明:
(1) strcat()函数将src字符串添加到dest字符串中,覆盖了在位置结束的空字节('\0')
dest的末尾,然后添加一个终止空字节。返回值是指向dest的指针。
(2)strncat()函数与strcat()函数类似,至少strncat()可以指定最多来自src的前n个字节。
代码演示:
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
char dest[16] = "hello";
char src [8] = "world";
char *ptr;
ptr = strcat(dest,src);
printf("ptr:%s\n",ptr); //正确结果:helloworld
ptr = strncat(dest,src,2);
printf("ptr:%s\n",ptr); //正确结果:helloworldwo
printf("dest:%s\n",dest); //正确结果:helloworldwo
printf("src:%s\n",src); //正确结果:world
return 0;
}
注意:
strcat()函数将src字符串添加到dest字符串中,所以必须要保证dest有足够的内存空间来容纳两个字符串,否则会导致溢出错误。dest末尾的\0会被覆盖,src末尾的\0会被复制过去,最终的字符串只有一个\0 。
6、strtok()函数
函数原型:
#include <string.h>
char *strtok(char *str, const char *delim);
函数说明:
strtok()函数将字符串分解为零或多个非空标记的序列。str是要解析的字符串,在第一次调用strtok()时,必须要指定str。之后调用该函数想解析相同的字符串,str必须为NULL。
delim参数指定一组字节,用于界定解析字符串中的标记。在解析相同字符串的连续调用中,调用者可以在delim中指定不同的字符串。
每次调用strtok()都会返回一个指向包含下一个token的以空字符结尾的字符串的指针。这个字符串不包含分隔符字节。如果没有找到token, strtok()返回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;
}
正确打印结果:
接下来,以这个代码为例,给大家讲解一下strtok()是如何工作的。
首先,在str指向的字符串中找到第一个“-”字符,并用NULL('/0')代替。然后返回一个指针token指针指向以空字符结尾的字符串。所以第一次打印hello 。
然后,strtok(NULL,"-")就是继续解析相同的字符串。继续找下一个“-”,并用NULL('/0')代替。然后返回一个指针token指针指向以空字符结尾的字符串。所以第二次打印world。
依此类推,就有如上的结果,不懂的同学可以私信问我。
7、memset()函数
函数原型:
#include <string.h>
void *memset(void *s, int c, size_t n);
函数说明:
memset()函数用常量字节c填充s指向的内存区域的前n字节。
代码演示:
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
char str[] = "hello";
memset(str,'!',sizeof(str));
printf("str:%s\n",str);
return 0;
}
正确打印结果:
注意:
为地址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。