手记

C语言的学习

一. C语言实现字符串

头文件如下:

#ifndef mystring_h#define mystring_h#include <stdio.h>typedef struct CString{
    char *point;    int length;
} mystring;/*******************字符串初始化**********************//**初始化一个空的字符串*/void init(mystring *string);/**初始化一个length长度的空字符串*/void initwithlength(mystring *string ,int length);/**初始化copystring字符串*/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 /* mystring_h */

.c文件

#include "mystring.h"#include <stdlib.h>#include <string.h>/**比较两个字符串的大小**/int mystrcmp(const char *str1,const char * str2){    if (str1 == NULL || str2 == NULL) return -1;    while (*str1 && *str2 && *str1 == *str2){
        str1++;
        str2++;
    }    /*如果dest > source,则返回值大于0,如果dest = source,则返回值等于0,如果dest < source ,则返回值小于0。*/
    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 == '\0')                return src;
        }while(*src++==*psub++);
        src+=1;
    }    return NULL;
}/***在串中查找指定字符的第一次出现位置***/char *mystrchr(const char *dest,const char ch){    if (dest == NULL) return NULL;    while (*dest != '\0') {        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 != '\0') {
        dest++;
    }    while ((*dest++ = *src++) && *src != '\0') ;
    *dest = '\0';    return p;
}/***字符串拷贝函数**/char * mystrcpy(char *dest,const char *src){    if (dest == NULL || src == NULL) return NULL;    char *p = dest;//存储字符串首地址
    while ((*dest++ = *src++) && *src != '\0');
    *dest = '\0';    return p;
}/***获取字符串长度**/int mystrlen(const char *p){    if (p == NULL) {        return  -1;
    }    int length = 0;    while (*p != '\0') {
        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%s\r\n",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] = '\0';        string->point[string->length-2] = ch;
    }else{        int length = mystrlen(string->point);        string->point[length] = ch;        string->point[length + 1] = '\0';
    }
}/**插入一个字符串*/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);//需要移动的长度
        //考虑到'\0',所以从length处开始遍历
        for (int i=length; i>length-moveLength; i--) {            string->point[i] = string->point[i-1];
        }        //插入字符
        string->point[length-moveLength] = ch;        
        //插入'\0'
        string->point[length+1] = '\0';
        
    }else{        int length = mystrlen(string->point);        int moveLength = mystrlen(pos);//需要移动的长度
        //考虑到'\0',所以从length处开始遍历
        for (int i=length; i>length-moveLength; i--) {            string->point[i] = string->point[i-1];
        }        //插入字符
        string->point[length-moveLength] = ch;        
        //插入'\0'
        string->point[length+1] = '\0';
        
    }
}/**在指定位置插入一个字符串*/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] = '\0';
        
    }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] = '\0';
    }
}/*******************字符串查找**********************/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!='\0'){
        *p++ = *pNext++;
    }
    *p = '\0';    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 != '\0') {
            *p++ = *pNext++;
        }
        *p = '\0';        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; i<length/2; i++) {        char tem = p[i];
        p[i] = p[length - 1 -I];
        p[length - 1 -i] = tem;
    }
}/*******************字符串大小写转换**********************/void toUpper(mystring *string){    if(string== NULL) return;    char *p = string->point;    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';
    }     //数组最后都带有一个\0结尾
    lastres[ j] = '\0';    printf( "last结果 = %s\n" , 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


0人推荐
随时随地看视频
慕课网APP