一. 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