头文件如下:
#ifndef mystring_h#define mystring_h#includetypedef 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; i 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';
} //数组最后都带有一个 结尾
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



