【C语言】常见的字符串处理函数

本文详细介绍了C语言中的字符串处理函数,包括strlen、strcpy、strncpy、strstr、strcmp、strncmp、strcat、strncat、strtok和memset,帮助读者理解它们的用法和区别。
摘要由CSDN通过智能技术生成

目录

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。

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学代码的小信

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值