函数str系列

本文主要介绍了C/C++中的多个字符串处理函数,包括strstr、strlen、strtok等。详细说明了各函数的功能,如查找子串、求长度、拆分字符串等,还指出了部分函数使用时的注意事项,像strcat和strcpy可能导致内存溢出等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数strstr(母串中找子串)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


//查找字符串

int main(int argc, char const *argv[])
{
    char str[] = "jackroseken";
    char *childstr = strstr(str,"rose");
    printf("%s\n",childstr);//roseken

    char *childstr1 = strstr(str,"zack");//找不到,不输出
    if(childstr1 == NULL)
    {
        printf("find failed");
    }
    else
         printf("%s\n",childstr1);
    return 0;
}

函数strlen(求一个指定字符串的长度)

 

///////////strlen.h///////////////
#include<stdio.h>

int mystrlen(const char *str)
{
    int i = 0;
    while(str[i])
    {
        i++;
    }
    
    return i;
}


/////////////strlen.c///////////////
/* 
My_strlen : 计算字符串长度,'0'除外

 */


int mystrlen(const char *str);



/////////////main.c////////////////
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include"mystrlen.h"

int main(int argc, char const *argv[])
{
   int len;
   char str[20];
   while(gets(str) != NULL)
   {
        len = mystrlen(str);
        printf("%d\n",len);
   }
    return 0;
}

函数strtok(母串拆子串)

 

注意:
  1. 该函数会将改变原始字符串 str,使其所包含的所有分隔符变成结束标记 ‘\0’ 。

  2. 由于该函数需要更改字符串 str,因此 str 指向的内存必须是可写的。

  3. 首次调用时 str 指向原始字符串,此后每次调用 str 用 NULL 代替

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//字符串拆解

/* int main(int argc, char const *argv[])
{
    char str[] = "www.csdn.com.cn";
    char *p = strtok(str,".");
    printf("%s,%s\n",p,str);
    p = strtok(NULL,".");
    printf("%s\n",p);
    p = strtok(NULL,".");
    printf("%s\n",p);
    p = strtok(NULL,".");
    printf("%s\n",p);
    return 0;
} */


int main(int argc, char const *argv[])
{
    char str[] = "www.csdn.com.cn";
    char *p = strtok(str,".");
    while (p != NULL)
    {
        printf("%s\n",p);
        p = strtok(NULL,".");
    }   
    return 0;
}

函数strcat与strncat(字符串拼接)

注意:
  1. 这两个函数的功能,都是将 src 中的字符串,复制拼接到 dest 的末尾。

  2. strcat() 没有边界控制,因此可能会由于 src 的过长而导致内存溢出。

  3. strncat() 有边界控制,最多复制 n+1 个字符(其中最后一个是 ‘\0’ )到 dest 的末尾。

#include<stdio.h>
#include<string.h>


//字符串拼接

int main(int argc, char const *argv[])
{
    char str[100] = "jack";
    //char *s = strcat(str,"rose");
    //printf("%s,%s\n",s,str);

    strcat(str,"rose");
    printf("%s\n",str);


    //拼接指定数目字符串
    char s[10]  = "abc";
    strncat(s, "123456789",sizeof(s)-strlen(s)-1);
    printf("%s\n", s); 
// 输出 "abc123456",两个字符串被拼接到了一起,且不会溢出
    return 0;
}

字符串函数拼接封装
/////////////////strcat.c///////////////////

#include<stdio.h>
#include<string.h>


char mystrcat(char *arr,char *buf)
{
    int i = 0;
    while (arr[i] != '\0')
    {
        i++;
    }
    int j = 0;
    while (buf[j])
    {
        arr[i+j] = buf[j];
        j++;
    }  
    return i;
}


/////////////strcat.h////////////////////

char mystrcat(char *arr,char *buf);


/////////////main.c//////////////////

#include<stdio.h>
#include<string.h>
#include"mystrcat.h"
#include<stdbool.h>

int main(int argc, char const *argv[])
{
    char arr[] = "hello";
    char buf[] = "world";
    mystrcat(arr,buf);
    printf("%s",arr);
    
    return 0;
}

函数strcpy与strncpy(复制字符串)

 

注意:
  1. 这两个函数的功能,都是将 src 中的字符串,复制到 dest 中。

  2. strcpy() 没有边界控制,因此可能会由于 src 的过长而导致内存溢出。

  3. strncpy() 有边界控制,最多复制 n+1 个字符(其中最后一个是 ‘\0’ )到 dest 中。

//////////////strcpy.c////////////

#include<stdio.h>
#include<string.h>

void mystrcpy(char *arr,char *buf)
{
    int i = 0;
    while(arr[i])
    {
        buf[i] = arr[i];
        i++;
    }
    buf[i] = 0; ;
}

///////////strcpy.h////////////////


void mystrcpy(char *arr,char *buf);


//////////main.c//////////////////


#include<stdio.h>
#include"mystrcpy.h"

int main(int argc, char const *argv[])
{
    char arr[100] = {0};
    char buf[100] = {0};
    printf("input :");
    scanf("%s",arr);
    mystrcpy(arr,buf);
    printf("output :%s",buf);
    return 0;
}

////////////strncpy.c///////////////////////

#include<stdio.h>


char mystrncopy(char *arr,char *buf,size_t n)
{
    int i = 0;;
    while(n)
    {
        arr[i] = buf[i];
        arr++;
        buf++;
        n--;
    }
    return 0;
}


///////////strncpy.h/////////////////

char mystrncopy(char *arr,char *buf,size_t n);

///////////main.c/////////////////////

#include<stdio.h>
#include"mystrncopy.h"

int main(int argc, char const *argv[])
{
    char arr[20] = "aaaaaaaaaa";
    char buf[6] = "bbbbb";
    
    mystrncopy(arr,buf,3);
    printf("output :%s\n",arr);
    return 0;
}

函数strcmp与strncmp(复制字符串)

注意:
  • 比较字符串大小,实际上比较的是字符的 ASCII码值的大小。

  • 从左到右逐个比较两个字符串的每一个字符,当能“决出胜负”时立刻停止比较。

strcmp
#include<stdio.h>
#include<string.h>

//字符串比较

//s1 > == < s2时,返回1,0,-1
//用于比较字符串内容是否相等,返回0
//只比较首字母,如果首字母相等再比较下一个字母
int main(int argc, char const *argv[])
{
    char s1[] = "acc";
    char s2[] = "abc";
    printf("%d\n",strcmp(s1,s2));
    if(strcmp(s1,s2) == 0)
    {
        printf("相等\n");
    }
    else
    {
        printf("不相等\n");
    }
    return 0;
}

 strncmp
#include<stdio.h>
#include<string.h>

//字符串比较

//s1 > == < s2时,返回1,0,-1
//用于比较指定数字符串是否相等
int main(int argc, char const *argv[])
{
    char s1[] = "acc";
    char s2[] = "abc";
    printf("%d\n",strcmp(s1,s2));
    if(strncmp(s1,s2,3) == 0)
    {
        printf("相等\n");
    }
    else
    {
        printf("不相等\n");
    }
    return 0;
}

函数strchr与strrchr(在指定的字符串查找特定字符串)

注意:
  1. 这两个函数的功能,都是在指定的字符串 s 中,试图找到字符 c。

  2. strchr() 从左往右找,strrchr() 从右往左找

  3. 字符串结束标记 ‘\0’ 被认为是字符串的一部分。

#include<stdio.h>
#include<string.h>


//在指定字符串内查找特定字符串
int main(int argc, char const *argv[])
{
    char str[] = "www.csdn.com.cn";
    char *p = strchr(str,'.');//从左往右找到第一个出现的字符'.'
    printf("%s\n%s\n",p,str);//输出".csdn.com.cn"
    printf("---------\n");
    char *p1 = strrchr(str,'.');//从右往左找到第一个出现的字符'.'
    printf("%s\n%s\n",p1,str);//输出".cn"
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值