【C进阶】字符串函数(strlen、strcpy、strcat、strcmp、strncpy、strncat、strncmp、strstr、strtok、strerror)

目录

前言:

1.字符串函数

1.0 参数检查

1.1 strlen

1.2 strcpy

1.3 strcat

1.4 strcmp

1.5 strncpy、strncat、strncmp

1.6 strstr

1.7 strtok

1.10 strerror

总结


前言:

           主要介绍的函数有strlen          strcpy         strcat         strcmp          strncpy         strncat         strncmp          strstr         strtok          strerror

1.字符串函数

1.0 参数检查

        我们在编程的时候,我们要时刻注意对参数的检查。常用的方法有两种,首先是使用if...else来判断(这样程序不会崩溃,可以继续运行)。使用断言(assert)(程序会崩溃,及时止损)具体的用法见后面的代码。具体在什么时候使用哪种方法,我们需要视情况而定。

1.1 strlen

        函数的意义是求字符串的长度,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。注意函数的返回值为size_t,是无符号的。函数的实现如下:

#include <stdio.h>
#include <assert.h>

size_t myStrlen(const char* str){

    assert(str!=NULL);              //当str=NULL时抛出异常,程序崩溃

    size_t len=0;
    while(str[len]!='\0'){
        len++;
    }
    return len;
}
int main()
{
    char str[]="abcdef";
    printf("%d\n",myStrlen(str));

    return 0;
}

1.2 strcpy

        字符串拷贝。源字符串必须以 '\0' 结束,并且会将源字符串中的 '\0' 拷贝到目标空间。 目标空间必须足够大,以确保能存放源字符串。函数的实现如下:

#include <stdio.h>
#include <assert.h>

char* myStrcpy(char* dest,char* src){
    assert(dest!=NULL);
    assert(src!=NULL);
    int i=0;
    while(src[i]!='0'){
        dest[i]=src[i];
        i++;
    }
    dest[i]='\0';
    return dest;
}
int main()
{
    char str[]="abcdef";
    char str1[1024]={0};
    myStrcpy(str1,str);
    printf("%s\n",str1);
    return 0;
}

1.3 strcat

        字符串拼接。源字符串必须以 '\0' 结束,目标空间必须有足够的大,能容纳下源字符串的内容。并且目标空间必须可修改。函数实现如下:

#include <stdio.h>
#include <assert.h>


char* myStrcat ( char* dest, const char* src ){
    assert(dest!=NULL);
    assert(src!=NULL);
    int i=0;
    while(dest[i]!='\0'){
        i++;
    }
    int j=0;
    while(src[j]!=0){
        dest[i+j]=src[j];
        j++;
    }
    dest[i+j]='\0';
    return dest;
}
int main()
{
    char str1[1024]="hello";
    char str2[1024]="world";
    myStrcat(str1,str2);
    printf("%s\n",str1);
    return 0;
}

1.4 strcmp

        字符串的比较。比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

return valueindicates
<0the first character that does not match has a lower value in ptr1 than in ptr2
0the contents of both strings are equal
>0the first character that does not match has a greater value in ptr1 than in ptr2

        

#include <stdio.h>
#include <assert.h>

int myStrcmp ( const char * str1, const char * str2 ){
    assert(str1!=NULL);
    assert(str2!=NULL);
    while(*str1 != '\0' && *str2 != '\0'){
        if(*str1<*str2){
            return -1;
        }else if(*str1>*str2){
            return 1;
        }else{
            str1++;
            str2++;
        }
    }
    if(*str1<*str2){
        return -1;
    }else if(*str1>*str2){
        return 1;
    }else{
        return 0;
    }
}
int main()
{
    char str1[1024]="hello";
    char str2[1024]="world";
    printf("%d\n",myStrcmp(str1,str2));
    return 0;
}

1.5 strncpy、strncat、strncmp

        strncpy、strncat就是多加了一层限制。通过n限制最大拷贝的个数,从而避免越界的情况。(仍然很鸡肋)。

        strncmp则是比较两个字符串的前n个。

1.6 strstr

        判定str2字符串是否时str1字符串的子串。如果找到就返回所在的下标的指针,如果找不到就返回NULL.实现方法如下:

#include <stdio.h>
#include <assert.h>

const char * myStrstr ( const char * str1, const char * str2 ){
    assert(str1!=NULL);
    assert(str2!=NULL);
    assert(*str1 != '\0');
    assert(*str2 != '\0');
    const char* black= str1;
    while(*black!='\0'){
        const char* red= black;
        const char* sub= str2;
        while(*red!='\0' && *sub != '\0' && *red == *sub){
            red++;
            sub++;
        }
        if(*red=='\0'){
            black++;
        }else if(*sub=='\0'){
            return black;
        }else{
            //*red!=*sub
            black++;
        }
    }
    return NULL;
}
int main()
{
    char str1[1024]="hello";
    char str2[1024]="el";
    printf("%p\n",myStrstr(str1,str2));
    return 0;
}

1.7 strtok

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

sep参数是个字符串,定义了用作分隔符的字符集合

第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。

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

strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

如果字符串中不存在更多的标记,则返回 NULL 指针。

其用法如下:

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

1.10 strerror

        有空再讲。

总结

        勤加练习。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值