str系列源码小结

1、strcmp

  ①、原形:int strcmp(const char * str1, const char * str2)
  ②、功能:比较两个字符串的大小
  ③、代码

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

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

int main()
{
    int ret = 0;
    char* str1 = "hellx";
    char* str2 = "hellw";

    ret = my_strcmp(str1,str2);

    if(ret > 0)
    {
        printf("%s > %s\n",str1,str2);
    }
    else if(ret < 0)
    {  
        printf("%s < %s\n",str1,str2);    
    }
    else
    {
        printf("equal!\n");
    }

    return 0;
}
int my_strcmp(const char* str1,const char* str2)
{
    assert(str1 != NULL && str2 != NULL);

    while(*str1 == *str2)
    {
        str1++;
        str2++;
    }

    return(*str1 - *str2);
}

2、strncmp

  ①、原形:int strncmp(const char * str1, const char * str2, int count)
  ②、功能:比较两个字符串中前count个字节的大小
  ③、代码

//比较两个字符串中前count个字节的大小
#include<stdio.h>
#include<assert.h>

int my_strncmp(const char* str1,const char* str2, int count);

int main()
{
    int ret = 0;
    int count = 5;
    char* str1 = "hellx";
    char* str2 = "hellw";

    ret = my_strncmp(str1,str2,count);

    if(ret > 0)
    {
        printf("前%d字符中:%s > %s\n",count,str1,str2);
    }
    else if(ret < 0)
    {  
        printf("前%d字符中:%s < %s\n",count,str1,str2);    
    }
    else
    {
        printf("equal!\n");
    }

    return 0;
}
int my_strncmp(const char* str1,const char* str2, int count)
{
    assert(str1 != NULL && str2 != NULL);

    if(!count)
    {
        return 0;
    }

    while((--count) && ((*str1++) == (*str2++)));

    return(*str1 - *str2);
}

3、strcpy

  ①、原形:void strcpy(char * destin, const char * source)
  ②、功能:把source指向的字符串拷贝到destin指向的字符串中
  ③、代码

//将source字符串拷贝到dest

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

void my_strcpy(char* dest,char* source);

int main()
{
    char str1[] = {0};
    char* str2 = "helloworld!";

    my_strcpy(str1,str2);
    puts(str1);

    return 0;
}

void my_strcpy(char* dest,char* source)
{
    assert(dest != NULL && source != NULL);  //断言

    while((*dest++ = *source++));
}

4、strncpy

  ①、原形:void strncpy(char * destin, const char * source,int count)
  ②、功能:把source指向的字符串中前count个字符拷贝到destin指向的字符串中
  ③、代码

/将source中的count个字符复制到dest中

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

void my_strncmp(char* dest,char* source,int count);

int main()
{
    char str1[] = {0};
    char *str2 = "hello world";
    int count = 13;

    my_strncmp(str1,str2,count);

    puts(str1);

    return 0;
}

void my_strncmp(char* dest,char* source,int count)
{
    assert((dest != NULL) && (source != NULL));

    while((count--) && (*dest++ = *source++));

}

5、strcat

  ①、原形:void strcat(char* dest, const char *source)
  ②、功能:将source中的字符串拼接到dest中
  ③、代码:

//拼接字符串
#include<stdio.h>
#include<assert.h>

void my_strcat(char* dest,const char* source);

int main()
{
    char str1[] = "hello";
    char* str2 = "world!";
    char* s = " ";

    my_strcat(str1,s);
    my_strcat(str1,str2);
    puts(str1);

    return 0;
}

void my_strcat(char* dest,const char* source)
{
    assert(dest != NULL && source != NULL);

    while(*dest)
    {
        dest++;
    }
    while((*dest++ = *source++));
}

6、strlen

  ①、原形:unsigned int strlen(const char * str)
  ②、功能:计算字符串长度
  ③、代码

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

unsigned int my_strlen(const char* str);

int main()
{
    unsigned int len = 0;
    char* str = "helloworld!";

    len = my_strlen(str);
    printf("字符串%s的长度为:%u \n",str,len);

    return 0;
}

unsigned int  my_strlen(const char* str)
{
    unsigned int len = 0;
    while(*str != '\0')
    {
        len++;
        str++;
    }

    return len;
}

7 、strchr

  ①、原形:char * strchr(char * str, const char ch)
  ②、功能:返回字符ch第一次出现的位置
  ③、代码:

//返回字符第一次出现的位置

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

char* my_strchr(char* str,const char c);

int main()
{
    char* str = "hello";
    char c = 'l';
    char *p = NULL;

    p = my_strchr(str,c);

    if(!p)
    {
        printf("Not find!\n");
    }
    else
    {
        printf("in %s,%c located:%p \n",str,c,p);
    }

    return 0;
} 
char* my_strchr( char* str,const char c)
{
    assert(str != NULL);
    char* temp = str;
    while(*temp && (*temp != c))
    {
        temp++;
    }

    return ((*temp == c) ? temp : NULL);
}

8、strrchr

  ①、原形:char * strrchr(char * str, const char ch)
  ②、功能:返回字符ch最后一次出现的位置
  ③、代码

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

char* my_strrchr(char* str,const char c);

int main()
{
    char* str = "hello";
    char c = 'l';
    char *p = NULL;

    p = my_strrchr(str,c);

    if(!p)
    {
        printf("Not find!\n");
    }
    else
    {
        printf("in %s,%c located:%p \n",str,c,p);
    }

    return 0;
} 
char* my_strrchr( char* str,const char c)
{
    assert(str != NULL);
    char* temp = str;
    while(*temp)
    {
        temp++;
    }
    while((temp != str) && (*temp != c))
    {
        temp--;
    }

    return ((*temp == c) ? temp : NULL);
}

9、strrev

  ①、原形:char * strdup(const char * str)
  ②、功能:拷贝字符串到新申请的内存
  ③、代码:

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

char* my_strdup(const char* str);

int main()
{
    char* str = "helloworld";

    char* temp = my_strdup(str);
    puts(temp);

    free(temp);

    return 0;
}

char* my_strdup(const char* str)
{
    char* temp = malloc(sizeof(char) * (strlen(str) + 1));
    assert(str != NULL && temp != NULL);
    strcpy(temp,str);

    return temp;
}

10、strrev

  ①、原形:void strrev(char * str);
  ②、功能:翻转字符串
  ③、代码

//翻转字符串
#include<stdio.h>
#include<assert.h>

void my_strrev(char* str);
int main()
{
    char str[] = "hello";

    my_strrev(str);

    puts(str);

    return 0;
}

void my_strrev(char* str)
{
    char* end = str;

    while(*end++);
    end--;   //与end++抵消
    end--;   //跳过'\0'

    while(str < end)
    {
        char temp;
        temp = *str;
        *str++ = *end;
        *end-- = temp;
    }
}

猜你喜欢

转载自blog.csdn.net/z_ryan/article/details/79250265
str