C语言字符串函数

1.strlen函数

功能讲解:

size_t strlen ( const char * str );//参数不能是NULL
                                   //const 是防止*str被改变

char arr[]="abcd"
char arr1[]={'a','b','c','d'};
strlen(arr);
strlen(arr1);

strlen是求字符串长度的函数,给定一个字符串,以'\0'结尾,该函数数到\0才会停下,所以上面的strlen求得arr长度为4,arr1长度未知,因为'\0'位置不知道。

注意函数的返回值是无符号数(易错)。

函数模拟实现:

方法1.计数器法

int count=0;
char arr[]="abcdef";
char*p=arr;

while(*p)
{
    count++;   //count的值就是字符串长度
    p++;
}

方法2.递归//这里只写递归部分

int my_strlen(const char *string)  //设置成int也可以,毕竟长度没有负数
{
    if(*string=='\0')
        return 0;
    else
        return 1+my_strlen(string+1);
}


方法3.指针-指针  //库函数的实现方法

const char*str=p;

while(++p)
{
    ;
}return (p-str-1);

2.strcpy函数

        功能讲解:

char * strcpy ( char * destination, const char * source );
//把源拷贝到目的地,两个指针分别是两端字符串的地址,const确保源不会被改变

既然是拷贝,就要确定拷贝多少,strcpy是以'\0'为拷贝结束标志的,且会把’\0‘拷贝到目的字符串。为确保拷贝成功,需要保证目的地空间足够且可以改变。

        模拟实现:

void my_strcpy(char*p1, const char*p2)
{
    assert(src!=NULL);  //断言,检查是否为NULL;
    while (*p1++ = *p2++)  //赋值表达式,值为赋值结果,当把'\0'赋值过来,循环结束
    {
        ;
    }
}

3.strcat函数

char * strcat ( char * destination, const char * source );

char arr1[100] ="opcs";
char arr2[] = "abcde";

strcat(arr1, arr2);

        功能讲解:

区分于strcpy,此函数是在目的字符串后面追加字符串,需要保证目的地空间足够。strcat首先会寻找目标字符串的'\0',然后把源数据追加过去,包括'\0',返回目标空间的地址。

注意该函数无法自己追加到自己后面,因为自己的'\0'会被覆盖,造成死循环,strncat才可以。

        功能实现

char* my_strcat(char*dest,const char *src)
{
    char *ret=dest;
    assert(dest&&src);
    while(dest)
{ dest++;  }    //寻找'\0'
    while(*dest++=*src++);//追加数据
    return ret;      //该函数的返回值也可以是void,视main()那边的情况而定
}

4.strcmp函数

        功能讲解:

int strcmp ( const char * str1, const char * str2 );

//字符串相等 返回0
//第一个字符串小返回 负数
//第一个字符串大返回 正数

字符串的比较是对应位置的字符的比较,

        模拟实现:

int my_strlen(const char* p1, const char* p2)
{
    assert(p1 && p2);
    while (*p1 == *p2)
    {
        if (*p1 == '\0')
        {
            return 0;
        }
        p1++;
        p2++;
    }
    return *p1 - *p2;   //返回正或者负值即可
}

5.strncpy函数(长度受限制的字符函数)

char * strncpy ( char * destination, const char * source, size_t num );

功能讲解:和strcp相比,strncpy可以限制拷贝字符数,但拷贝的字符数不要超过目标空间的大小,否则会造成越界,和strcpy类似。

功能实现:

void my_strcpy(char*p1, const char*p2,int count)
{
    assert(src!=NULL);  //断言,检查是否为NULL;
    
    while (count--)  
    {
       *p1=*p2;
        p1++;
        p2++;
    }
}

6.strncat

char * strncat ( char * destination, const char * source, size_t num );

功能讲解:此函数是在目的字符串后面追加n个字符串,需要保证目的地空间足够。strncat首先会寻找目标字符串的'\0',然后把源数据追加过去,并且加上'\0',返回目标空间的地址。如果n太大,源字符串不足,则将源字符串全部追加过去。注意strncat可以在自己后面追加字符串,这一点和strcat不一样。

char* my_strcat(char*dest,const char *src,int count)
{
    char *ret=dest;
    assert(dest&&src);
    while(dest)
{ dest++;  }    //寻找'\0'

    while(count--)//追加数据
{
    if((*dest++=*src++)==0)
        return (ret);
}
    *dest='\0';
    return ret;      //该函数的返回值也可以是void,视main()那边的情况而定
}

7.strncmp

int strncmp ( const char * str1, const char * str2, size_t num );

该函数功能和strcmp差不多,只不过多了一个n限制比较的字符长度,比较简单,就不多说。

8.strstr

const char * strstr ( const char * str1, const char * str2 );
      char * strstr (       char * str1, const char * str2 );

功能讲解:在str1字符串里查找是否存在str2字符串,找到后会返回第一次出现的位置,没找到会返回一个NULL。比如:在abcde里面找bc,会返回b的地址。

功能实现:

char* my_strstr(const char*str1,const char*str2)
{
    char*s1=str1;
    char*s2=str2;
    const char*cp=str1;
if(*str2=='\0')
    return (char*) str1;   //str2是空指针

while(*cp)
{
    s1=cp;              //可能会多次匹配,比如bbc,abbbcd 这种情况
    s2=str2;
    while(*s1==*s2&&*s1&&*s2)
      {
        s1++;
        s2++;
      }
    if(*s2='\0")
        {return cp;}
        cp++;
}
retur NULL;
            
也可以用KMP算法  有一定难度,效率比较高

  9.strtok

char * strtok ( char * str, const char * delimiters );

//delimiters是字符串,定义了用作分割符的集合

功能讲解:按照标点符号切割字符串,第一个参数指定一个字符串,它包含了0个或者多个由del字符串中的一个或者多个分隔符分割的标记。

strtok函数找到str中的下一个标记,并将其用'\0'结尾,返回一个指向这个标记的指针。(注:该函数会改变被操作额字符串,所以在使用strtok函数切割的字符串一般都是临时拷贝的内容并且可以修改。)

strtok的第一个参数如果不为NULL,函数将找到str中的第一个标记,并记录它在字符串中的位置,

strtok函数的第一个参数如果为NULL。函数将在同一个字符串中被保存的位置开始,查找下一个标记,如果找不到更多的标记,则返回NULL指针。

使用方法:

int main () {
   char str[80] = "This is - www.runoob.com - website";
   const char s[2] = "-";
   char *token;
   strcpy(token,str)        //拷贝字符串,避免被修改

    char *temp=NULL;
for(temp=strtok(token,s);temp!=NULL;temp=strtok(NULL,s))
{
    printf("%s\n",temp);
}
   
   return(0);
}

10.strerror

char * strerror ( int errnum );

//必须包含的头文件:<error.h>

功能讲解:使用库函数失败的时候,返回错误码

使用方法:

FILE*p=fopen("test.txt","r")   //打开一个不存在的文件

if(P==NULL)
{
    printf("%s\n"strerror(p,errno);  errno 全局变量,需要包含头文件error.h
    return 1;
}

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
C语言字符串函数的原型可以在C标准库的string.h头文件中找到。其中一些常用的字符串函数的原型如下: 1. strlen函数的原型是:size_t strlen(const char *str); 这个函数用于计算字符串的长度,返回的是字符串中字符的个数,不包括空字符'\0'。 2. strcpy函数的原型是:char *strcpy(char *dest, const char *src); 这个函数用于将源字符串src复制到目标字符串dest中,并返回目标字符串的指针。 3. strcat函数的原型是:char *strcat(char *dest, const char *src); 这个函数用于将源字符串src追加到目标字符串dest的末尾,并返回目标字符串的指针。 4. strcmp函数的原型是:int strcmp(const char *str1, const char *str2); 这个函数用于比较两个字符串str1和str2的大小关系。如果str1小于str2,则返回一个负数;如果str1等于str2,则返回0;如果str1大于str2,则返回一个正数。 5. strchr函数的原型是:char *strchr(const char *str, int c); 这个函数用于在字符串str中查找字符c的第一次出现,并返回该字符的指针。 这些函数只是C语言字符串函数中的一部分,还有很多其他的字符串函数可以在string.h头文件中找到。 #### 引用[.reference_title] - *1* [C语言字符串函数及如何实现这些函数](https://blog.csdn.net/weixin_29007243/article/details/117020047)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【经典】C语言字符串函数原型](https://blog.csdn.net/sinat_36184075/article/details/69372144)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [字符串查找函数C语言字符串查找函数详解](https://blog.csdn.net/weixin_35433448/article/details/117013859)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ke vin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值