栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言的学习

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言的学习

一. C语言实现字符串

头文件如下:

#ifndef mystring_h#define mystring_h#include typedef struct CString{
    char *point;    int length;
} mystring;void init(mystring *string);void initwithlength(mystring *string ,int length);void initwithstring(mystring *string, char *copystring);void printfstring(mystring *string);void addCharWithEnd(mystring *string,char ch);void addStringWithEnd(mystring *string , char *addString);void addChar(mystring *string ,char ch,char *pos);void addString(mystring *string ,char* str,char *pos);char * findfirstchar(mystring *string, char findchar);char * findfirststring(mystring *string, char* substr);int deletesubchar(mystring *string, char subchar);int deletesubstring(mystring *string, char* substr);void modifyFirstChar(mystring *string,const char oldchar,const char newchar);void modifyFirstString(mystring *string,char* const oldstr,char*  const newstr);void reverseString(mystring *string);void toUpper(mystring *string);void toLowwer(mystring *string);int compare(mystring *str1,mystring *str2);int zp_atoi(mystring *string);#endif 

.c文件

#include "mystring.h"#include #include int mystrcmp(const char *str1,const char * str2){    if (str1 == NULL || str2 == NULL) return -1;    while (*str1 && *str2 && *str1 == *str2){
        str1++;
        str2++;
    }    
    return *str1 - *str2;
}char * mystrstr(const char *src,const char *sub){    if(src==NULL||NULL==sub) return NULL;    const char *psrc=src;    const char *psub=sub;    while(*src)
    {
        psrc=src;
        psub=sub;        do{            if(*sub == '')                return src;
        }while(*src++==*psub++);
        src+=1;
    }    return NULL;
}char *mystrchr(const char *dest,const char ch){    if (dest == NULL) return NULL;    while (*dest != '') {        if (*dest == ch) {            return dest;
        }
        dest ++;
    }    return NULL;
}char * mystrcat(char *dest,const char *src){    if (dest == NULL || src == NULL) return NULL;    char *p = dest;//存储字符串首地址
    while (*dest != '') {
        dest++;
    }    while ((*dest++ = *src++) && *src != '') ;
    *dest = '';    return p;
}char * mystrcpy(char *dest,const char *src){    if (dest == NULL || src == NULL) return NULL;    char *p = dest;//存储字符串首地址
    while ((*dest++ = *src++) && *src != '');
    *dest = '';    return p;
}int mystrlen(const char *p){    if (p == NULL) {        return  -1;
    }    int length = 0;    while (*p != '') {
        length ++;
        p ++;
    }    return length;
}void init(mystring *string){    string->point = NULL;    string->length = 0;
}void initwithlength(mystring *string ,int length){    string->point = (char *)calloc(length, sizeof(char));    string->length = length;
}void initwithstring(mystring *string, char *copystring){    int length = mystrlen(copystring);    string->point = (char *)calloc(length+1, sizeof(char));
    mystrcpy(string->point, copystring);    string->length = length +1;
}void printfstring(mystring *string){    printf("n%srn",string->point);
}void addCharWithEnd(mystring *string,char ch){    //如果长度已经满了
    if(mystrlen(string->point) + 1 == string->length){        string->point = realloc(string->point, string->length + 1);        string->length +=1;        string->point[string->length-1] = '';        string->point[string->length-2] = ch;
    }else{        int length = mystrlen(string->point);        string->point[length] = ch;        string->point[length + 1] = '';
    }
}void addStringwithend(mystring *string , char *addString){    int length = mystrlen(string->point);    int nowLength = mystrlen(addString);    
    //如果超出长度,需要重新分配内存空间
    if (length + nowLength + 1 > string->length) {        string->point = (char *)realloc(string->point, length + nowLength + 1);        string->length = length +nowLength + 1;
        mystrcat(string->point, addString);
    }else{
        mystrcat(string->point, addString);
    }
}void addChar(mystring *string ,char ch,char *pos){    if (string == NULL || pos == NULL) {        return;
    }    //如果超出长度,需要重新分配内存空间
    if (mystrlen(string->point) + 1 == string->length) {        string->point = (char *)realloc(string->point, string->length+1);        string->length +=1;        int length = mystrlen(string->point);        int moveLength = mystrlen(pos);//需要移动的长度
        //考虑到'',所以从length处开始遍历
        for (int i=length; i>length-moveLength; i--) {            string->point[i] = string->point[i-1];
        }        //插入字符
        string->point[length-moveLength] = ch;        
        //插入''
        string->point[length+1] = '';
        
    }else{        int length = mystrlen(string->point);        int moveLength = mystrlen(pos);//需要移动的长度
        //考虑到'',所以从length处开始遍历
        for (int i=length; i>length-moveLength; i--) {            string->point[i] = string->point[i-1];
        }        //插入字符
        string->point[length-moveLength] = ch;        
        //插入''
        string->point[length+1] = '';
        
    }
}void addString(mystring *string ,char* str,char *pos){    if(string == NULL || pos == NULL || str== NULL){        return;
    }    int nowLength = mystrlen(string->point);    int addLength = mystrlen(str);    int moveLength = mystrlen(pos);    
    //如果超出长度需要重新分配存储空间
    if (nowLength + addLength + 1 > string->length) {        string->point = (char *)realloc(string->point, nowLength + addLength + 1);        string->length = nowLength + addLength + 1;        
        int moveLength = mystrlen(pos);        int lenth = mystrlen(string->point);        int i= addLength + nowLength - 1;        for (; i>lenth-moveLength; i--) {            string->point[i] = string->point[i - addLength];
        }        //插入字符
        while (*str) {            string->point[i] = *str;
            str++;
            I++;
        }        //插入空字符
        string->point[string->length - 1] = '';
        
    }else{        
        int i = nowLength + addLength -1;        for (; i>nowLength-moveLength; i--) {            string->point[i] = string->point[i-addLength];
        }        //插入字符
        while (*str) {            string->point[i] = *str;
            str++;
            I++;
        }        //插入空字符
        string->point[string->length - 1] = '';
    }
}char * findfirstchar(mystring *string, char findchar){    char *p = mystrchr(string->point, findchar);    return p;
}char * findfirststring(mystring *string, char *subStr){   char *p =  mystrstr(string->point, subStr);   return p;
}int deletesubchar(mystring *string, char subchar){  char *p = findfirstchar(string, subchar);    if (p == NULL) {        return 0;
    }    char *pNext = p+1;    while (*pNext!=''){
        *p++ = *pNext++;
    }
    *p = '';    return 1;
}int deletesubstring(mystring *string, char* substr){   char *p = findfirststring(string, substr);    if (p == NULL) {        return 0;
    }else{        //获取要删除的字符串长度
        int length = mystrlen(substr);        char *pNext = p + length;        while (*pNext != '') {
            *p++ = *pNext++;
        }
        *p = '';        return 1;
    }
   
}void modifyFirstChar(mystring *string,const char oldchar,const char newchar){    if (string == NULL) return;    char *p = string->point;    while (*p) {        if (*p == oldchar) {
            *p = newchar;            break;
        }
        p++;
    }
    
}void modifyFirstString(mystring *string,char* const oldstr,char*  const newstr){    if(string == NULL) return;    
    char *pfind = findfirststring(string, oldstr);    if (pfind == NULL) return;    
    //删除遇到的第一个字符串
    deletesubstring(string, oldstr);    
    //插入新的字符串
    addString(string, newstr, pfind);
}void reverseString(mystring *string){    if(string == NULL) return;    int length = mystrlen(string->point);    char *p = string->point;    
    for (int i=0; ipoint;    while (*p) {        if (*p >= 'a' && *p <= 'z') {
            *p = *p -32;//大写A = 65 小写a = 97;
        }
        p++;
    }
}void toLowwer(mystring *string){    if(string == NULL) return;    char *p = string->point;    while (*p) {        if (*p>='A' && *p<='Z') {
            *p = *p +32;
        }
        p++;
    }
}int compare(mystring *str1,mystring *str2){    if (str1 == NULL || str2 == NULL) return -1;    char *p1 = str1->point;    char *p2 = str2->point;    return  mystrcmp(p1, p2);
}int zp_atoi(mystring *string){    if (string == NULL) {        return 2147483647;//直接返回异常值
    }    int res =0;    char *p = string->point;    //如果等于空字符
    while (*p&& *p==' ') {
        p++;
    }    int isMinus = 1;//-1表示是负数,1表示是正数,默认是正数
    if(*p == '+' || *p=='-'){        if (*p == '-') {
            isMinus = -1;
        }
        p++;
    }    char *px = p;//保存首地址;
    while (*p) {        if (*p < '0' || *p > '9') {            return 2147483647;//直接返回异常数据
        }
        p++;
    }    while (*px) {
        res = res *10 + *px - '0';
        px++;
    }    return res * isMinus;
}
二. 大数据乘法的实现

比如

    char *str1 = "12345";    char *str2 = "19";

void getbigdata (char *dataa , char *datab ){    int lengtha = strlen( dataa);          //计算数组长度
    int lengthb = strlen( datab);    //用于储存中间变量
    int * pres = ( int *) malloc( sizeof( int)*( lengtha + lengthb));    //对指针所指的内存空间进行初始化,赋值为0
    memset( pres, 0, sizeof( int)*( lengtha + lengthb));    
    for ( int i = 0; i < lengtha; i++)
    {        for ( int j = 0; j < lengthb; j++)
        {            //将字符转化成整形进行乘法运算,完成乘数和被乘数的按位相乘,并且相加,并把结果储存在pres中
            pres[ i+ j+1] += ( dataa[ i] - '0')*( datab[ j] - '0');
        }
    }    //进行进位,取余运算
    for ( int i = lengtha + lengthb - 1; i >= 0; i--)
    {        if ( pres[ i]>=10)
        {            //进位
            pres[ i - 1] += pres[ i] / 10;            
            //去除个位数
            pres[ i] %= 10;
        }
    }    int i = 0;    //刚刚对pres指向的内存全部初始化成了0,所以这里是将0去除
    while ( pres[ i] == 0)
    {
        i++;
    }    //将结果转存在lastres数组中
    char * lastres = malloc( sizeof( char)*( lengtha + lengthb));    int j;    for ( j = 0; j < lengtha + lengthb; j++, i++)
    {
        lastres[ j] = pres[ i] + '0';
    }     //数组最后都带有一个结尾
    lastres[ j] = '';    printf( "last结果 = %sn" , lastres );
}

执行:

int main(int argc, const char * argv[]) {    printf( "请输入您想计算的两个数据");    char str1[100] = { 0 };    char str2[100] = { 0 };    scanf( "%s%s" , str1 , str2 );    printf( "str1 = %s,str2 = %s" , str1 , str2 );
    getbigdata( str1, str2);    return 0;
}



作者:Mark_Guan
链接:https://www.jianshu.com/p/3fcf8fdc07ae


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/233358.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号