字符串常用操作实现

一、strcpy与strncpy原型

  其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy

char* strcpy(char *strDest, const char *strSrc)
{
    if ( strDest == NULL || strSrc == NULL)
        return NULL ;
    if ( strDest == strSrc)
        return strDest ;
    char* res = strDest;
    while(*strDest++ = *strSrc++)
    {
        NULL;
    }
    return res;
}
/*
功能为拷贝字符串内容到目的串,把src所指向的内容的前num个字符拷贝到dest;
标准库中返回指针不是以null即‘\0‘结束的,必须手动添加
*/
char* strncpy(char* strDest , const char* strSrc , unsigned int num)
{
    if ( strDest == NULL || strSrc == NULL)
            return NULL ;

    if (0 == num)
    {
        *strDest = ‘\0‘;
        return strDest ;
    }

    char* res = strDest ;
    while(*strDest ++ = *strSrc ++)
    {
        if (--num == 0)
        {
            *strDest = ‘\0‘;
            break;
        }
    }
    return res;
}

二、strcat与strncat原型

  

//////////////////////////////////////////////////////////////////////////
//功能为连接两个字符串,把src连接到dest后面;返回dest地址;
//////////////////////////////////////////////////////////////////////////
char* strcat(char* dest, const char* src)
{
    if ( dest== NULL || src== NULL)
        return NULL ;

    char* res = dest;
    while(*dest)     // *dest != ‘\0‘
    {
        dest++;
    }
    while (*dest++ = *src++)
    {
        NULL;
    }  

    return res;
}  
/*
//功能为连接两个字符串,把src连接到dest后面;返回dest地址;
*/
char* strncat(char* dest, const char* src, unsigned int num)
{
    if ( dest== NULL || src== NULL)
        return NULL ; 

    if (!num)
    {
        return dest;
    }  

    char* res = dest;
    while(*dest)     // *dest != ‘\0‘
    {
        dest++;
    }
    while(*dest++ = *src++)
    {
        if (--num == 0)
        {
            *dest = ‘\0‘;
            break;
        }
    }  

    return res;
}  

三、strlen原型

//////////////////////////////////////////////////////////////////////////
//功能为返回字符串str的长度(不包括‘\0‘);
//size_t strlen ( const char * str );
//////////////////////////////////////////////////////////////////////////
unsigned int strlen(const char* str)
{
    if (str == NULL)
        return 0;
    unsigned int len = 0;
    while(*str++)
    {
        len++;
    }
    return len;
}     

四、strcmp与strncmp原型

//////////////////////////////////////////////////////////////////////////
//功能为比较两个字符串;
//当str1指向的字符串大于str2指向的字符串时,返回正数。
//当str1指向的字符串等于str2指向的字符串时,返回0。
//当str1指向的字符串小于str2指向的字符串时,返回负数。;
//////////////////////////////////////////////////////////////////////////
int strcmp(const char* str1, const char* str2)
{
    assert((str1 != NULL) && (str2 != NULL));  

    while (*str1 && (*str1 == *str2))
    {
        str1++;
        str2++;
    }
    return *str1-*str2;
}  
//////////////////////////////////////////////////////////////////////////
//功能为比较两个字符串前num个字符;
//当str1指向的字符串大于str2指向的字符串时,返回正数。
//当str1指向的字符串等于str2指向的字符串时,返回0。
//当str1指向的字符串小于str2指向的字符串时,返回负数。;
//////////////////////////////////////////////////////////////////////////
int strncmp(const char* str1, const char* str2, unsigned int num)
{
    assert((str1 != NULL) && (str2 != NULL));  

    if (!num)
        return 0;  

    while (--num && *str1 && (*str1 == *str2))
    {
        str1++;
        str2++;
    }
    return *str1-*str2;
} 

五、strchr与strrchr原型

//////////////////////////////////////////////////////////////////////////
//功能为查找str中首次出现c的位置,如有有,则返回出现位置,否则返回NULL;
//////////////////////////////////////////////////////////////////////////
/*
const char * strchr ( const char * str, int character );
char * strchr (       char * str, int character )
*/
char* strchr(char* str, char c)
{
    if (NULL == str)
         return NULL;

    while(*str && *str != c)
    {
        str++;
    }
    if (*str == c)
        return str;  

    return NULL;
}  
//////////////////////////////////////////////////////////////////////////
//功能为查找str中最后一次出现c的位置,如有有,则返回出现位置,否则返回NULL;
//////////////////////////////////////////////////////////////////////////
char* strrchr(char* str, char c)
{
    if (NULL == str)
        return NULL;

    char* res = str;
    while(*res++)
        ;
    while((--res != str) && (*res != c))
        ;
    if (*res == c)
        return res;  

    return NULL;
}

六、strspn与strcspn原型

//////////////////////////////////////////////////////////////////////////
//功能:在字符串str1中搜寻str2中所出现的字符
//说明:返回第一个出现的字符在s1中的下标值
//亦即在s1中出现而s2中没有出现的子串的长度;
//////////////////////////////////////////////////////////////////////////
unsigned int strcspn ( const char * str1, const char * str2 )
{
    assert((str1 != NULL) && (str2 != NULL));
    // map有32个字节的大小,也就是256个bit,可把map堪称一个2维数组[32][8]
    unsigned char map[32] = {0};  

    // 每个ASCII码(设为c)有8bit,把它分成2部分,低3位构成下标j(通过c&7(2进制为111));
    // 高5位构成下标i(通过c>>3得到)。这样在map[i][j]中置1表示字符存在;
    while(*str2)
    {
        map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7));
        str2++;
    }
    map[0] |= 1;  

    unsigned int count = 0;
    while(!(map[*str1 >> 3] & (unsigned int)(1 << (*str1 & 7))))
    {
        count++;
        str1++;
    }  

    return count;
}
//返回字符串中第一个不在指定字符串中出现的字符下标
//亦即第一个在s1中出现且s2中存在的子串的长度;
unsigned int strspn(char* str1, char* str2)
{
    assert((str1 != NULL) && (str2 != NULL));
    // map有32个字节的大小,也就是256个bit,可把map堪称一个2维数组[32][8]
    unsigned char map[32] = {0};  

    // 每个ASCII码(设为c)有8bit,把它分成2部分,低3位构成下标j(通过c&7(2进制为111));
    // 高5位构成下标i(通过c>>3得到)。这样在map[i][j]中置1表示字符存在;
    while(*str2)
    {
        map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7));
        str2++;
    }
    map[0] |= 0;  

    unsigned int count = 0;
    while((map[*str1 >> 3] & (unsigned int)(1 << (*str1 & 7))))
    {
        count++;
        str1++;
    }
    return count;
}
int strspn(const char *s,const char *accept)
{
    const char *p;
    const char *a;
    int count = 0;
    for(p = s; *p != ‘\0‘; ++p)
    {
        for (a = accept; *a != ‘\0‘; ++a)
        {
            if (*p == *a)
            {
                break;
            }
        }//里面的for循环到此为止
        if (*a == ‘\0‘)
        {
            return count;
        }
        ++count;
    }    //外面的for循环到此为止
    return count;
}

七、strstr原型

//需找str字符串中出现strSearch字符串位置的指针。如果没找到,则返回NULL,如果strSearch为空,则返回str;
char* strstr(char* str,char* strSearch)
{
    /*
    int length1=strlen(str);
    int length2=strlen(strSearch);
    while(length1>=length2)
    {
        length1--;
        if(!strncmp(str,strSearch,length2))//比较前n个字符串;
            return str;
        str++;
    }
    return NULL;
    */
    char* b = strSearch;
    if( *b == NULL )
    {
        return str;
    }  

    char* a = NULL;
    for( ; *str != NULL; str++)
    {
        if( *str != *b )
        {
            continue;
        }  

        a = str;
        while(1)
        {
            if( *b == NULL )
            {
                return str;
            }
            if( *a++ != *b++ )
            {
                break;
            }
        }  

        b = strSearch;
    }  

    return NULL;
}  

八、strpbrk原型

//在源字符串(str1)中找出最先含有搜索字符串(str2 )中的任一字符的位置并返回,若找不到则返回空指针;
//与strnspn的算法一样,只是前者返回相同字符的指针位置,后者返回相同字符的个数;
char* strpbrk(char* str1,char* str2)
{
    assert((str1 != NULL) && (str2 != NULL));
    // map有32个字节的大小,也就是256个bit,可把map堪称一个2维数组[32][8]
    unsigned char map[32] = {0};  

    // 每个ASCII码(设为c)有8bit,把它分成2部分,低3位构成下标j(通过c&7(2进制为111));
    // 高5位构成下标i(通过c>>3得到)。这样在map[i][j]中置1表示字符存在;
    while(*str2)
    {
        map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7));
        str2++;
    }
    map[0] |= 1;  

    while(*str1)
    {
        // 如果有相同的字符则返回;
        if( map[*str1 >> 3] & (1 << (*str1 & 7)) )
            return str1++;  

        str1++;
    }  

    return NULL;
}  
时间: 2024-08-05 07:28:08

字符串常用操作实现的相关文章

Python学习笔记五:字符串常用操作,字典,三级菜单实例

字符串常用操作 7月19日,7月20日 ,7月22日,7月29日,8月29日,2月29日 首字母大写:a_str.capitalize() 统计字符串个数:a_str.count("x") 输出字符,不够的使用指定的字符补上,字符居中:a_str.center(50,"-") 判断字符串以什么结尾:a_str.endwith("xx") 将字符串中的tab转换为指定数目的空格:a_str.expandtabs(tabsize=30) 查找指定字符

JavaScript字符串常用操作函数之学习笔记

字符串简介 使用英文单引号或双引号括起来,如:’Hello’,”World”,但是不能首尾的单引号和双引号必须一致,交错使用,如果要打印单引号或者双引号,可以使用转义字符\’(单引号),\”(双引号)  代码如下 复制代码 var str_1 = 'Hello World!';  //Hello World!var str_2 = "Hello World!";  //Hello World!var str_3 = '他说:"这样可以的."';  //他说:&quo

python列表、字典、字符串常用操作

Python 列表.字典.字符串常用操作 1.字符串操作 字符串可以通过下标取值,但由于字符串是不可变变量,不可通过下标来修改值. str = 'lily terry mark' name[0]    #获取第1个字符串值 name[0:7]   #获取第1~7的字符串值 name[:7]   #缺省开始位置,默认从第1个元素开始取值 name[0:]   #缺省结束位置,默认到字符串末尾结束 字符串包含判断操作符:in .not in .is 'lily' in names 'lily' no

JS基础-数据类型转化和字符串常用操作

模块回顾 1.数据类型的转化.数-字,字-整,字-浮. 2.字符串常用操作.10种. 一.数据类型的转化 通过"+"号或toString()方法将数值转换成字符串. 2.通过parseInt()将字符串转换成整型. 3.通过parseFloat()将字符串转换成浮点型. <html> <head> <meta charset="utf-8"> <title>数据类型的转换</title> <scrip

python3之字符串常用操作练习补充二

字符串常用操作练习补充二 1 #coding:utf-8 2 3 #***将"\t"转为空白符,默认使各段字符串长度为8的整数倍,指定长度则以指定的长度为准 4 str1 = "\tThis\tis Tab test\t!" 5 print(str1.expandtabs()) 6 ''' 7 输出结果为: 8 This is Tab test ! 9 |8字符 |8字符 |16字符 |! 10 ''' 11 print(16*"*") 12 1

javascript中字符串常用操作总结、JS字符串操作大全

字符串的操作在js中非常频繁,也非常重要.以往看完书之后都能记得非常清楚,但稍微隔一段时间不用,便会忘得差不多,记性不好是硬伤啊...今天就对字符串的一些常用操作做个整理,一者加深印象,二者方便今后温习查阅. String对象属性 (1) length属性 length算是字符串中非常常用的一个属性了,它的功能是获取字符串的长度.当然需要注意的是js中的中文每个汉字也只代表一个字符,这里可能跟其他语言有些不一样. var str = 'abc'; console.log(str.length);

数组 字符串 常用操作

数组 常用操作 /*数组的属性*/ var arr=[1,3,34,45,44,88]; document.write(arr.constructor+"<br/>"); document.write(arr.length+"<br/>"); /*数组的方法*/ var arr2=["a","b","c","d"]; document.write(arr.conc

js--javascript中字符串常用操作总结、JS字符串操作大全

字符串的操作在js中非常频繁,也非常重要.以往看完书之后都能记得非常清楚,但稍微隔一段时间不用,便会忘得差不多,记性不好是硬伤啊...今天就对字符串的一些常用操作做个整理,一者加深印象,二者方便今后温习查阅. String对象属性 (1) length属性 length算是字符串中非常常用的一个属性了,它的功能是获取字符串的长度.当然需要注意的是js中的中文每个汉字也只代表一个字符,这里可能跟其他语言有些不一样. var str = 'abc'; console.log(str.length);

python数据类型-字符串常用操作

这次主要介绍字符串常用操作方法及例子 1.python字符串 在python中声明一个字符串,通常有三种方法:在它的两边加上单引号.双引号或者三引号,如下: name = 'hello' name1 = "hello bei jing " name2 = '''hello shang hai haha''' python中的字符串一旦声明,是不能进行更改的,如下: #字符串为不可变变量,即不能通过对某一位置重新赋值改变内容 name = 'hello' name[0] = 'k' #通

python3字符串常用操作练习

练习一下字符串的常用操作 1 #-*- coding:utf-8 -*- 2 3 #字符串的常用操作 4 5 str = "1111 Hell :wo:rld! " 6 7 #删除头尾所有指定字符串,默认移除空白符,也可以移除指定字符串 8 print(str.strip()) 9 print(str.strip("1")) 10 11 #分割,str.split(str,maxsplit),maxsplit可选,为最大拆分次数,默认全部拆分 12 print(st