Num2)returnNum2;els" />

#define ANum1 285
#define ANum2 3500
// printf(" %d %c \\n", (int)'a', (char)123);//字符查看ASCⅡ表
// printf(" %d %d \\n", (int)"我"[0], (int)"我"[1]);//汉字查看ASCⅡ表
//《构造函数部分》
// Small_Num 求较小函数 求两个整型数据中较小的一个,返回值为较小的数
int Small_Num(int Num1, int Num2)
{
if(Num1 > Num2)
return Num2;
else
return Num1;
}
// Bige_Num 求较大函数 求两个整型数据中较大的一个,返回值为较大的数
int Bige_Num(int Num1, int Num2)
{
if(Num1 > Num2)
return Num1;
else
return Num2;
}
// Str_Len 求字符串求长函数 求任意长度字符串 或 指针指向的字符串 的字符串长度,返回值为字符数加1(即字符串长度)
int Str_Len(char Str2[])
{
int i = 0;
while(Str2[i] != 0) //求长原理字符串最后以0 结尾,统计不为0,直到为0 时即可
i++;
return i + 1;
}
// Arr_Len 求字符串数组元素个数的函数,返回值为字符串数
int Arr_Len(char Str2[][ANum1]) //求元素个数要求数组中不能含有空串,该函数只统计到出现空串为止,另外数组的外层参数ANum1必须给出且与数组相同
{
int i = 0;
while(Str2[i][0] != 0) //求长原理字符串第一位不为0,统计不为0,直到为0 时即可
i++;
return i-1;
}
// char-> int 转换, s[]为待转换成数字的数字字符串,一个参数时将s[]转换成十进制数,Str_Len为数字位数
int Char_Int(char s[])
{
int Total = 0;
for(int i = 0; i < Str_Len(s)-1; i++) // Str_Len 求字符串求长函数,也可将函数定义成Char_Int(char s[],int Num)将Str_Len(s)改为Num即可
{
int Tmp = s[i]-48; //Tmp用于存储字符串各个字节处转换后的的数字s[i]-48,转换前该字节处用s[i]表示该数字字符
Total = Total * 10 +Tmp; //将各位数字字合成字符所表示的数据
}
return Total; //返回数字处理后得到的数字
}
// char-> int 转换, s[]为待转换成数字的数字字符串,两个参数时将s[]转换成Num进制数并以十进制输出,Str_Len为数字位数
int Char_Int(char s[], int Num)
{
int Total = 0;
for(int i = 0; i < Str_Len(s)-1; i++) // Str_Len 求字符串求长函数,也可将函数定义成Char_Int(char s[],int Num)将Str_Len(s)改为Num即可
{
int Tmp = s[i]-48; //Tmp用于存储字符串各个字节处转换后的的数字s[i]-48,转换前该字节处用s[i]表示该数字字符
Total = Total * Num +Tmp; //将各位数字字合成字符所表示的数据
}
return Total; //返回数字处理后得到的数字
}
// int-> char 转换, char s[]为有足够长度的字符串,用于存储数字生成的字符串
char * Int_Char( int n, char s[])
{
int Tmp_n = n,Length = 0;
while(Tmp_n >= 1) //求出待转换成字符的 数字的长度Length
{
Length++;
Tmp_n /= 10; //依次除10直到小于1退出循环
}
for(int i=0; i Tmp_n = n%10; //对待转换的数字各位依次取余数,存入Tmp_n中 n /= 10 ; //对待转换的数字依次去尾数,以便下一次取余数 s[Length-1-i] = Tmp_n + 48; //将各位数字 依次转换成对应 数字字符 所对应的数字(即Tmp_n + 48),再存入字符串的相应位置(即s[Length-1-i] } s[Length] = 0; //位数字字符串 设尾 return s; //返回生成的数字字符串 } // Str_Cpy 字符串拷贝函数,将字符串从源字符串Str2拷贝到目标字符串Str1,返回值Str1所对应的字符串 char * Str_Cpy(char Str1[], const char Str2[]) { int i = 0; while(Str2[i] != 0) { Str1[i] = Str2[i]; i++; } Str1[i] = 0; return Str1; } // Str_Cpy 字符串拷贝函数,从源字符串Str1中拷贝前Num个字符串Str2中,返回值Str2所对应的字符串 char * Str_Cpy(const char Str1[], int Num, char Str2[]) { int i = 0; while(Str1[i] != 0 && i Str2[i] = Str1[i]; i++; } Str2[i] = 0; return Str2; } // Str_Cpy 字符串拷贝函数,从Str1第Num1个字符的位置开始,拷贝Num2个字符到Str2中,返回值Str2所对应的字符串 char * Str_Cpy(const char Str1[], int Num1, int Num2, char Str2[]) { int i = 0; while(Str1[i] != 0 && i Str2[i] = Str1[i+Num1-1]; i++; } Str2[i] = 0; return Str2; } //使得Str的长度变为Len的整数倍不足部分添加空格 char * Str_Chg(char Str[], int Len) { int i, LenS=Str_Len(Str); if((LenS%Len) !=0 ) //对字符串进行处理使得Str的长度为Len的整数倍 { for(i=LenS-1; i < ((LenS/Len + 1) * Len)-1; i++) Str[i]=' '; Str[i]=0; } return Str; } //字符串str2加空格添加函数,添加至str1的尾部 char * str_add(char str1[], char str2[]) { int i = 0, j = 0; while(str1[i] != 0) i++; //当str1到达尾部时 str1[i++] = ' '; //将结尾改为空格 while(str2[j] != 0) //并将str2非结尾部分添加至str1后 { str1[i] = str2[j]; i++; j++; } str1[i] = 0; //为str1添加结尾 return str1; } // Str_Add 将字符串Str2添加到字符串Str1的尾部 char * Str_Add(char Str1[], char Str2[] ) // 须包含Str_Len 求字符串长函数,需给Str1分配内存空间,例:char str[50]="apple"; Str_Add(str, " banana")); { int Num=Str_Len(Str1)-1; for(int i=Str_Len(Str1); i > Num; i--) Str1[(i-1)+(Str_Len(Str2)-1)] = Str1[i-1]; //将字符串1的第i-1个字符向后移动字符串Str2个字符数 for(i=0; i < Str_Len(Str2)-1; i++ ) Str1[Num+i]=Str2[i]; return Str1; } // Str_Add 将字符串Str2添加到字符串Str1 从左向右(0 1 2 3……)第Num处,Num=0时添加到第一个字符串前, //Num=StrLen(Str1)-1添加到第一个字符串末尾,倒数第四个位置为StrLen(Str1)-5 char * Str_Add(char Str1[], int Num, char Str2[] ) { for(int i=Str_Len(Str1); i > Num; i--) //须包含Str_Len 求字符串长函数 Str1[(i-1)+(Str_Len(Str2)-1)] = Str1[i-1]; //将字符串1的第i-1个字符向后移动字符串Str2个字符数 for(i=0; i < Str_Len(Str2)-1; i++ ) Str1[Num+i]=Str2[i]; return Str1; } // Str_Cmp_Min 字符串比较函数(按字母表的顺序)比较两个字符串的大小,输出较小的字符串对应的数字 //返回值1表示字符串Str1较小;返回值2字符串Str1较小;返回0时两个字符串相同 int Str_Cmp_Min(char Str1[], char Str2[]) //需包含构造函数Small_Num、Str_Len { int CM_i = Small_Num(Str_Len(Str1), Str_Len(Str2)); //取较短的字符串长度进行比较,(即比较至字符长度的后一位 for(int i = 0; i < CM_i; i++) //CM_i: Circulate Max Number i { if(Str1[i] == Str2[i]) //如果字符串的第一个字符相同 i++; //则跳过上一个字符 if(Str1[i] > Str2[i]) //比较字符串的第二个字符 { return 2; i = CM_i - 1; } if(Str1[i] < Str2[i]) { return 1; i = CM_i - 1; } } return 0; //有返回的值函数 return 0 必需为最外层返回才有效 } //判断str2是否是str1的子串,str2必须从str1的 第一位开始 int str_inc(char str1[], char str2[]) { int i = 0; while(str2[i] != 0) //当str2未至结尾时 { if(str2[i] != str1[i]) return 0; //当两字符串对应字符不相同时,返回0 if(str2[++i] == 0) return 1; //当str2至结尾时,返回1 } return 0; } //Str_Inc 两个参数的string include 函数用于判断字符串Str1中是否含有字符串Str2,包含几个返回值就为几,返回CountS2的值 int Str_Inc(char Str1[], char Str2[]) //需包含构造函数Str_Len { int CountL, CountS2 = 0; //CountL用于统计字符串长度是否达到Str2的长度, CountS2用于计数与Str2相同的字符串个数 for(int i = 0; i < Str_Len(Str1)-1; i++) { int k=i; if(Str1[i] == Str2[0]) //当第一个字符串相同时开始进一步比较剩下几位是否相同 { CountL = 1; for(int j = 1; j < Str_Len(Str2)-1; j++) if(Str1[++k] == Str2[j]) CountL++; } else CountL = 0; //对CountL进行清零操作避免CountS2统计出错 if(CountL == Str_Len(Str2)-1) //当剩下几位也相同时即含有与Str2相同的部分 CountS2++; //统计个数 } return CountS2; } //Str_Inc_NoDif 不区分大小写的字符比较函数 两个参数的string include 函数用于判断字符串Str1中是否含有字符串Str2,包含几个返回值就为几,返回CountS2的值 int Str_Inc_NoDif(char Str1[], char Str2[]) //需包含构造函数Str_Len { char Tmp1[ANum1], Tmp2[ANum1]; Str_Cpy(Tmp1, Str1); Str_Cpy(Tmp2, Str2); int CountL, CountS2 = 0; //CountL用于统计字符串长度是否达到Str2的长度, CountS2用于计数与Str2相同的字符串个数 for(int i = 0; i < Str_Len(Tmp1)-1; i++) { int k=i, j; if(Tmp1[i]< 97) Tmp1[i] += 32; //不区分大小写时,将大写全部转换成小写,进行比较 if(Tmp2[0]< 97) Tmp2[0] += 32; if(Tmp1[i] == Tmp2[0]) //当第一个字符串相同时开始进一步比较剩下几位是否相同 { CountL = 1; for(j = 1; j < Str_Len(Tmp2)-1; j++) if(Tmp1[++k] == Tmp2[j]) { if(Tmp1[k]< 97) Tmp1[k] += 32; if(Tmp2[j]< 97) Tmp2[j] += 32; CountL++; } } else CountL = 0; //对CountL进行清零操作避免CountS2统计出错 if(CountL == Str_Len(Tmp2)-1) //当剩下几位也相同时即含有与Str2相同的部分 CountS2++; //统计个数 } return CountS2; } //Str_Inc 三个参数的string Iclude 函数用于将字符串Str1中第Num个Str2是字符的起始位置i作为返回值返回,当Str1中不含有Str2时,i的返回值为Str1的字符串长度 int Str_Inc(char Str1[], int Num, char Str2[]) //需包含构造函数Str_Len { int i, CountL, CountS2 = 0; //CountL用于统计字符串长度是否达到Str2的长度, CountS2用于计数与Str2相同的字符串个数 for( i = 0; i < Str_Len(Str1)-1; i++) { if(Str1[i] == Str2[0]) //当第一个字符串相同时开始进一步比较剩下几位是否相同 { int k=i; CountL = 1; for(int j = 1; j < Str_Len(Str2)-1; j++) if(Str1[++k] == Str2[j]) CountL++; } else CountL = 0; //对CountL进行清零操作避免CountS2统计出错 if(CountL == Str_Len(Str2)-1) //当剩下几位也相同时即含有与Str2相同的部分 CountS2++; //统计个数 if(CountS2 == Num) return i; //返回第Num个Str2处起始处i的值 } return Str_Len(Str1); } // Str_Son,求字符串数组最小子字符串函数,数组的最内层下标可以省略str1[][ANum1],其余参数必须补齐且与待处理数组相同 //将字符串数组str1中的子串存入数组str2中对应的位置 void Str_Son(char str1[][ANum1], char str2[][ANum1]) //需包含构造函数Arr_Len、Str_Len、三个参数Str_Cpy、三个参数的Str_Inc { int total=Arr_Len(str1); for(int i=0; i for(int j=0; j int include=0; Str_Cpy(str1[i], j+1, str2[i]); //将子字符串拷贝到str2[i]中 for(int i2=0; i2 if(i2 != i && Str_Inc(str1[i2], 1, str2[i])==0) //当str2[i2]与str2[i]不是同一个字符串,且str1[i2]开始的位置就含有子字符串str2[i]时,计数变量include自加 include++; } if(include == 0) j=Str_Len(str1[i]-1); //没有与子字符串相同时退出循环 } } } //将字符串str2从str1的 第一位开始清除 char * str_del(char str1[], char str2[]) { if(str_inc(str1, str2) == 0) return str1; //判断str2是否为str1的子串,若不是直接返回str1不删除 int i = 0, j = 0; while(str2[i] != 0) i++; //当str2未至结尾时 while(str1[i-1] != 0) //当str2未至结尾str1还未至结尾时 { str1[j] = str1[i]; //将str1的后str2位从开始位置开始复制 j++; i++; } str1[j] = 0; //为str2加上结尾 return str1; } //Str_Del String delit 函数用于将字符串Str1中的第Num个Str2字符串删除 char * Str_Del(char Str1[], int Num, char Str2[]) // 需包含构造函数Str_Len、Str_Inc、 { //当Str1中没有Str时最大循环数CM_j < 0, j初值为0 且j++,j < CM_j不成立,返回Str1的值 int i=Str_Inc(Str1, Num, Str2); //通过三个参数的string Iclude获取第Num个Str2在字符串str1字符串的起始位置i int CM_j=Str_Len(Str1)-(Str_Len(Str2)-1)-i; //求循环操作长度 for(int j=0; j return Str1; //输出Str1 !!! 注意! 在引用函数Str_Del时,Str1必须有属于自己的内存空间,如: Str_Del("apple", 1,"pp")时,系统就 } //Str_Del String delit 函数用于删除字符串Str1中的所有Str2 char * Str_Del(char Str1[], char Str2[]) //需包含构造函数Str_Len、两参数的Str_Inc、三参数的Str_Del { int count=Str_Inc(Str1, Str2); //统计开始时Str2含有多少个Str1 while(count-- != 0) Str_Del(Str1, 1, Str2); return Str1; } //Str_Rep 四个参数的String Rplace函数 用一个字符串Str3去取代字符串Str1中的第Num个字符串Str2 char * Str_Rep(char Str1[], char Str2[], int Num, char Str3[]) //需包含构造函数Str_Inc、Str_Del、Str_Add //取代时Str1须有自己的内存空间才能写入,还需有足够容纳取代后总字符的 { //空间否则会发生数组越界可能会导致部分信息丢失 int i=Str_Inc(Str1, Num, Str2); //用i记住第Num个Str2在Str1的起始位置 Str_Del(Str1, Num, Str2); //删除Str1中第Num个Str2 Str_Add(Str1, i, Str3); //将字符串Str3添加到Str1的i处 return Str1; } //Str_Rep 三个参数的String Rplace函数 用一个字符串Str3去取代字符串Str1中所有的Str2 char * Str_Rep(char Str1[], char Str2[], char Str3[]) //需包含构造函数Str_Inc、Str_Del、Str_Add、四个参数的Str_Rep { int count=Str_Inc(Str1, Str2); //统计开始时Str2含有多少个Str1 while(count-- != 0) Str_Rep(Str1, Str2, 1, Str3); return Str1; } //引用qsort排序 int Cmp(const void * ele1, const void * ele2) { return(strcmp((char*)ele1, (char*)ele2)); //引用strcmp字符串比较函数,在头文件string.h中 } void main() { char Arr[4][9]={"bnanan qsort(Arr, 4, 9, Cmp); //引用qsort排序函数,在头文件stdlib.h中 for(int i=0; i<4; i++) printf("%s ",Arr[i]); } //Arr_Sort字符数组排序函数,对数组内的字符串进行排序 若想实现,去重后输出,可使用选择输出, //即排序后的后一个与前一个不同时输出if(Str_Cmp_Min(ATmp[i], ATmp[i-1]) != 0){ printf(" %s",ATmp[i]);} void Arr_Sort(char ATmp[][ANum1]) //需包含构造函数 Arr_Len、Str_Cmp_Min、两参数的Str_Cpy { int CM_i = Arr_Len(ATmp); for(int i = 0; i < CM_i-1; i++) { char Tmp[ANum1]; //Tmp为排序交换 提供字符串缓存空间 for(int j = i+1; j < CM_i; j++) { if( Str_Cmp_Min(ATmp[i], ATmp[j]) == 2) //当后一个字符串ATmp[j]小于前一个字符串ATmp[i]时,将两字符串进行交换 { Str_Cpy(Tmp,ATmp[i] ); Str_Cpy(ATmp[i], ATmp[j]); Str_Cpy(ATmp[j], Tmp); } } } } // Str_Sort 对字符串内字符排序函数,对Str1按从小到大进行排序后输出 char * Str_Sort(char Str1[]) //需包含Str_Len函数 { char Tmp; for(int i=0; i < Str_Len(Str1)-2; i++) { for(int j=i+1; j < Str_Len(Str1)-1; j++) if(Str1[i] > Str1[j]) { Tmp = Str1[i]; Str1[i] = Str1[j]; Str1[j] = Tmp; } } return Str1; } // Str_Sort 对字符串内字符排序函数,对Str1排序后存储到Str2中,Str1保持不变,返回值Str2 char * Str_Sort(char Str1[], char Str2[]) //需包含Str_Cpy、Str_Len两个构造函数 { Str_Cpy(Str2, Str1); char Tmp; for(int i=0; i < Str_Len(Str2)-2; i++) { for(int j=i+1; j < Str_Len(Str2)-1; j++) if(Str2[i] > Str2[j]) { Tmp = Str2[i]; Str2[i] = Str2[j]; Str2[j] = Tmp; } } return Str2; } // Str_Sort 对字符串内字符排序函数,对Str1中字符按Num里给的字符顺序进行排序,Len为Num数组的元素个数,最后不足Len长度的原样拷贝,最后两位原样拷贝 char * Str_Sort(char Str[], int Num[], int Len) //需包含Str_Len、Str_Cpy两个构造函数 { int j, i, CMi=Str_Len(Str)-2; //因为在使用gets获取一整行字符串时最后一位是字符结尾0,倒数第二位是换行符也要排除在字符长度之外不能参与字符排序交换 char Tmp[ANum1]; //ANum1需给定 for(i=0; i < (CMi/Len)*Len; i++) //选取Str的Len的整数倍进行交换 { if(i%Len==0) j=0; Tmp[i] = Str[(i/Len)*Len+(Num[j++]-1)]; } for(i; i < CMi+1; i++) //选取Str的Len的余数部分原样拷贝,多加一位将倒数第二位的换行符也拷贝上 { if(i%Len==0) j=0; Tmp[i] = Str[i]; } Tmp[i]=0; //为字符串添加结尾 Str_Cpy(Str, Tmp); return Str; } //Get_Num 字符串自动生成列序函数,根据输入的字符串大小数序依次取出对应的列号存放到Num数组中,如:Get_Num("95423", Num),可得列序Num[]={4,5,3,2,1} int * Get_Num(char Str[], int Num[]) //需包含Str_Len、Str_Sort两个构造函数 文本加密时使用,使用此列序加密文本 { int countk, countj; char Tmp[ANum1]; Str_Sort( Str, Tmp); //对Tmp里的字符按从小到大排序 for(int i=0; i < Str_Len(Str)-1; i++) { countj=0; for(int j=0; j < Str_Len(Str)-1; j++) if(Tmp[i] == Str[j]) //Tmp中某一个字符与Str中的某个字符相同时 { countj++; //countj 用于计数Str中第几个字符与Tmp[i]相同,故每次i循环计数前时清为0 Num[i]=j+1; int k=i; countk=1; while(Tmp[k--] == Tmp[k-1]) countk++;//countk 用于计数Tmp中多少个相同的字符,故每次计数前清为1 if(countj==countk) j=Str_Len(Str)-1;//当Tmp中第几个相同的字符与Str中第几个相同的字符对应时退出循环 } } return Num; } //Get_Num 数组自动生成列序函数,根据输入数组中数据的大小数序依次取出对应的列号存放到Num数组中,如:Get_Num({1,5,4,2,3}, Num),可得列序Num[]={1,4,5,3,2} // 数组Num1中元素需从1开始连续且不相同,Len1为数组Num1中元素个数 int * Get_Num(int Num1[], int Num2[], int Len1) //用于对给定的列序数组再次求列序,文本解密时使用,使用此列序还原文本 { for(int i=0; i return Num2; } //Line_Lock 字符串列序锁函数,对str中的字符按key中字符密码换序加密 //key中存放任意字符密码,对符合列排序大小关系的密码均可解密 char * Line_Lock(char str[], char key[]) //需包含函数两参数的Get_Nu、三参数的Str_Sort { int keyTmp[ANum1]; Get_Num(key, keyTmp); Str_Sort(str, keyTmp, Str_Len(key)-1); return str; } //Line_Key 字符串列序匙函数,对str中的字符按key中字符密码换序解密 //key中存放任意字符密码,对符合列排序大小关系的密码均可解密 char * Line_Key(char str[], char key[]) //需包含函数两参数的Get_Num、三参数的Get_Num、三参数的Str_Sort { int keyTmp1[ANum1], keyTmp2[ANum1]; Get_Num(key, keyTmp1); Get_Num(keyTmp1, keyTmp2,Str_Len(key)-1); Str_Sort(str, keyTmp2, Str_Len(key)-1); return str; } //Aph_Lock 字符串字母锁函数,对str中的字符按key中字符密码换序加密 //key中存放任意字符密码 char * Aph_Lock(char str[], char key[]) //需包含函数两参数的Str_Len { for(int i=0; i int k, t, y, Num=Char_Int(key); y = Num%3; Num /= 3; if(y !=0) y=1; if(i % (Str_Len(key)-1) == 0) k=0; //该循环使得key密码中的字符循环发挥作用对字符加密 if(str[i]>='A' && str[i]<='Z') //判断字符是否属于'A'—'Z',是则有可能是大写字母 { t = str[i]+key[k++]-47; if(t >'Z') str[i] = t-26; //字符'0'对应整数48,若加字符后大于'Z'则-26,使其依然属于'A'—'Z' else str[i] = t; } if(str[i]>='a' && str[i]<='z') //判断字符是否属于'a'—'z',是则有可能是大写字母 { t = str[i]+key[k++]-47; if(t >'z') str[i] = t-26; //字符'0'对应整数48,若加字符后大于'z'则-26,使其依然属于'a'—'z' else str[i] = t; } if(str[i]==0) str[i]=9; if(str[i]< 0) str[i]+=y; } return str; } //Aph_key 字符串字母锁函数,对str中的字符按key中字符密码换序加密 //key中存放任意字符密码 char * Aph_Key(char str[], char key[]) //需包含函数两参数的Str_Len { for(int i=0; i int k, t, y, Num=Char_Int(key); y = Num%3; Num /= 3; if(y !=0) y=1; if(i % (Str_Len(key)-1) == 0) k=0; //该循环使得key密码中的字符循环发挥作用对字符加密 if(str[i]>='A' && str[i]<='Z') //判断字符是否属于'A'—'Z',是则有可能是大写字母 { t= str[i]-(key[k++]-47); if(t <'A') str[i] =t+26; //字符'0'对应整数48,若减字符后小于'A'则+26,使其依然属于'A'—'Z' else str[i] = t; } if(str[i]>='a' && str[i]<='z') //判断字符是否属于'a'—'z',是则有可能是大写字母 { t= str[i]-(key[k++]-47); if(t <'a') str[i] =t+26; //字符'0'对应整数48,若减字符后小于'a'则+26,使其依然属于'a'—'z' else str[i] = t; } if(str[i]<=0) str[i]-=y; } return str; } //AL_Lock 字符串列序锁函数,对str中的字符按key中字符密码换序加密 //key中存放任意字符密码,对符合列排序大小关系的密码均可解密 char * AL_Lock(char str[], char key[]) //需包含函数Aph_Lock、Line_Lock { Aph_Lock(str, key); Line_Lock(str, key); return str; } //LA_Key 字符串列序锁函数,对str中的字符按key中字符密码换序加密 //key中存放任意字符密码,对符合列排序大小关系的密码均可解密 char * LA_Key(char str[], char key[]) //需包含函数Aph_Lock、Line_Lock { Line_Key(str, key); Aph_Key(str, key); return str; } //LA_Lock 字符串列序锁函数,对str中的字符按key中字符密码换序加密 //key中存放任意字符密码,对符合列排序大小关系的密码均可解密 char * LA_Lock(char str[], char key[]) //需包含函数Line_Lock、Aph_Lock { Line_Lock(str, key); Aph_Lock(str, key); return str; } //AL_Key 字符串列序锁函数,对str中的字符按key中字符密码换序加密 //key中存放任意字符密码,对符合列排序大小关系的密码均可解密 char * AL_Key(char str[], char key[]) //需包含函数Line_Lock、Aph_Lock { Aph_Key(str, key); Line_Key(str, key); return str; } //Get_DateDay 获取给定日期2到给定日期1的天数 int Get_DateDay( int year1, int mouth1, int day1, int year2, int mouth2, int day2) { int ds[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int y1, m1, d1, y2, m2, d2, sum = 0, sign = 1; if(year1 > year2) { y1 = year2; m1 = mouth2; d1 = day2; y2 = year1; m2 = mouth1; d2 = day1; sign = -1; } else { y1 = year1; m1 = mouth1; d1 = day1; y2 = year2; m2 = mouth2; d2 = day2; } //信息输入要求提示 if(m1 > 12) printf("\\n 一年没有%d月\\n", m1 ); if(d1 > ds[m1 - 1]) printf("\\n %d月没有%d天\\n", m1, d1); if(m2 > 12) printf("\\n 一年没有%d月\\n", m2 ); if(d2 > ds[m2 - 1]) printf("\\n %d月没有%d天\\n", m2, d2); // scanf("%d%d%d%d%d%d", &y1, &m1, &d1, &y2, &m2, &d2); if((y1 % 400 == 0) || (y1 % 4 == 0 && y1 % 100 != 0)) ds[1] = 29; //判断第一年是否是闰年 else ds[1] = 28; if(y1 == y2) //判断是否为同一年 { for(int j = m1; j < m2; j++) //若是 则统计m1到m2-1 sum += ds[j - 1]; sum = sum - d1 + d2; //去除m1多加的,加上m2未加的 } else //判断不是同一年,即y1小于y2时 { for(int j = m1; j <= 12; j++) sum += ds[j - 1]; //先计算y1到年底的天数 sum -= d1; y1 ++; if(y1 != y2 ) //判断此时的y1是否到了y2的那一年 { if(y1 % 400 == 0 || (y1 % 4 == 0 && y1 % 100 != 0)) sum += 366; //若不是 判断是否为闰年 //若是闰年,一年是366天 else sum += 365; //若不是闰年,一年是365天 y1 ++; //直到y1 为y2的那一年时 结束循环 } //计算最后一年从年头开始到m2 d-2 的天数 if(y1 % 400 == 0 || (y1 % 4 == 0 && y1 % 100 != 0)) ds[1] = 29; else ds[1] = 28; for(j = 1; j < m2; j++) sum += ds[j - 1]; sum += d2; } return sum * sign; } //Get_DateDay 获取给定日期为周几, 返回值为临时缓存字符串,应使用一个字符串来存储否则调用完毕内存即被释放无法输出,先将其复制给其他的字符串,strcpy(s, Get_DateDay(2011, 8, 29));再输出 char * Get_DateDay( int year, int mouth, int day) { int i = Get_DateDay( 2011, 8, 28, year, mouth, day); char Dateday[7][7] = {"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; if(i >= 0) { i = i % 7; return Dateday[i]; } else { i = -i % 7; return Dateday[7-i]; } } int getnum(int N) //获取给定数字N的位数,10位数以下 { int i=0; int S=1; while(S < N) { i++; S = 10 * S; } return i; } int numMax(int N) //将N转换成最大组合数 { int * M,i, j, t, n = getnum(N); M=(int*)malloc(n*sizeof(int)); //动态分配一个长度为n的整形数组空间, 须包含#include for(i=0; i M[i] = N%10; N = N/10; } for(i=0; i } t=0; for(i=0; i } int numMin(int N) //将N转换成最小组合数 { int * M,i, j, t, n = getnum(N); M=(int*)malloc(n*sizeof(int)); //动态分配一个长度为n的整形数组空间 for(i=0; i M[i] = N%10; N = N/10; } for(i=0; i } t=0; for(i=0; i } /* int ciclNum(int N) //求是否存在循环数 { int t = N, Max; do { Max = numMax(t); t = Max-numMin(t); //最大排列数与最小排列数之差 printf("%d - %d = %d \\n", Max, Max-t, t); if(t == N)return 0; //若差值t与N再次相同时,退出循环 }while(numMax(t) != Max); //当差值的最大排列数,与前一个最大数不相同时一直循环下去 return Max; } */ int ciclNum(int N) //求是否存在循环数 { int t = N, Max, s=0; do { Max = numMax(t); t = Max-numMin(t); //最大排列数与最小排列数之差 printf("%d - %d = %d \\n", Max, Max-t, t); if(t == N)return 0; //若差值t与N再次相同时,退出循环 if(s==100)return Max; //设置一个循环断点,以免出现无限循环 s++; }while(numMax(t) != Max); //当差值的最大排列数,与前一个最大数不相同时一直循环下去 return Max; } //此时可以求出由A中的元素组成str的方法有N种,以N所代表的元素为返回值 void Function(char A[][4], char str[],int &N) { int i; char sTmp[30] = " "; for(i=0; i<9; i++) //式中9为A中元素的个数 { strcpy(sTmp, str); if(str_inc(sTmp, A[i]) == 1) //当A[i]为sTmp的子串时 { str_del(sTmp, A[i]); //将A[i]从sTmp中删除 if(sTmp[0] == 0) N++; //当变成空串时,N计数加一 else Function(A, sTmp, N); //当不是空串时,递归调用 } } return; } // 222.《项目主体部分》 // 222.1. //@ @@@@@ 文本换行 起始位置 @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ {//除main函数公共部分,以及几个构造函数 Str_Len 部分,可直接引用 int i=0, lineNum=1, TotalSizeO=0, TotalStrO=0; char Tmp[500]; printf("\\n\\n\\n\\n\\n\\n 请输入每行字符串个数,以便按要求输出 Enter键确认。\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\"); scanf("%d",&lineNum); while (fscanf(fpSrc,"%s",Tmp)!=EOF) { i++; printf(" %s",Tmp); fprintf(fpDest," %s",Tmp); if((i % lineNum) == 0) { printf("\\n"); fprintf(fpDest,"\\n"); } TotalSizeO += Str_Len(Tmp); } TotalStrO = i; printf("\\n\\n 此文本有 %d 条字符串,共 %d KB \\n\\n", TotalStrO, TotalSizeO/1024+1); } //@@@@@ @@@@@ 文本换行 结尾位置 @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ // 222.2. //@@@@@ @@@@@ 自定义连接符字符串合并 起始位置 @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ {//除main函数公共部分,以及几个构造函数 Str_Len 部分,可直接引用 int i=0, lineNum=1, TotalSizeO=0, TotalStrO=0; char Tmp[501], Scanf_Str[501]; printf("\\n\\n\\n\\n\\n\\n 请输入需要连成一体的字符串个数 Enter键确认。\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\"); scanf("%d",&lineNum); printf("\\n\\n 请输入 < 500 字节的自定义连接符 \\n\\n Enter键确认。\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\"); scanf("%s",&Scanf_Str); while (fscanf(fpSrc,"%s",Tmp)!=EOF) { i++; printf("%s",Tmp); fprintf(fpDest,"%s",Tmp); if((i % lineNum) == 0) { printf(" "); fprintf(fpDest," "); } else { printf("%s",Scanf_Str); fprintf(fpDest,"%s",Scanf_Str); } TotalSizeO += Str_Len(Tmp); } TotalStrO = i; printf("\\n\\n 此文本有 %d 条字符串,共 %d KB \\n\\n", TotalStrO, TotalSizeO/1024+1); } //@@@@@ @@@@@ 字符串合并 结尾位置 @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ // 222.3. //@@@@@ @@@@@ 文本排序去重主体 起始位置 @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ {//除main函数公共部分,以及几个构造函数 Str_Cpy、Str_Len、Str_Cmp_Min部分,可直接引用 int i=0, j, ChocNum1=1, ChocNum2=1, TotalStrO=0, TotalStrP=0, TotalSize = 0, CM_i=0; char ATmp[ANum2][ANum1],Tmp[ANum1]; //定义字符串Tmp用于临时存储经fscanf函数从源文件中获取的字符串 printf("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n 请选择: 1.整行排序 2.全文排序 Enter键确认\\n\\n\\n \"); scanf("%d",&ChocNum1); // 1.将文件内容存入临时数组ATmp, 并统计字符串数TotalStrO,也是临时数组排序最大位置,顺便计算出总字节数TotalSize if(ChocNum1 != 2 ) { while(fgets(Tmp, ANum1-1, fpSrc)) //数据整行存入字符串缓存 { Str_Cpy(ATmp[i], Tmp); //将缓存数据存入字符串数组 TotalSize += Str_Len(ATmp[i]); i++; } TotalStrO = i; } else { while((fscanf(fpSrc,"%s",Tmp)) != EOF) //数据按字符串存入缓存 { Str_Cpy(ATmp[i], Tmp); //将缓存数据存入字符串数组 TotalSize += Str_Len(ATmp[i]); i++; } TotalStrO = i; } // 2.开始对数组内的字符串按从小到大 排序 相同的数据会被排列在一起 CM_i = TotalStrO; for( i = 0; i < CM_i-1; i++) { char Tmp[ANum1]; //Tmp为排序交换 提供字符串缓存空间 for( j = i+1; j < CM_i; j++) { if( Str_Cmp_Min(ATmp[i], ATmp[j]) == 2 )//当后一个字符串ATmp[j]小于前一个字符串ATmp[i]时,将两字符串进行交换 { Str_Cpy(Tmp,ATmp[i] ); Str_Cpy(ATmp[i], ATmp[j]); Str_Cpy(ATmp[j], Tmp); } } } // 3.选择输出 排序后文本时进行 即去重 printf("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n 是否进行去重排序: 1.是 2.否 Enter键确认\\n\\n\\n \"); scanf("%d",&ChocNum2); if(ChocNum2 == 2) { for( i = 0; i < CM_i; i++) { fprintf(fpDest," %s", ATmp[i]); //将字符串写入源文件中 printf(" %s",ATmp[i]); //写入源文件同时屏幕输出 TotalStrP++; if(ChocNum1 != 2 ) { fprintf(fpDest,"\\n", ATmp[i]); //将换写入源文件中 printf("\\n",ATmp[i]); //写入源文件同时屏幕输出 if(ChocNum1 != 1 ) { fprintf(fpDest,"\\n", ATmp[i]); //将换行符写入源文件中 printf("\\n",ATmp[i]); //写入源文件同时屏幕输出 } TotalStrP++; } } } else { for( i = 0; i < CM_i; i++) { if(Str_Cmp_Min(ATmp[i], ATmp[i-1]) != 0)//因为前面已经实现了排序,只需判断后一个和前一个是否相同,不相同即可输出 { fprintf(fpDest," %s", ATmp[i]); //将字符串写入源文件中 printf(" %s",ATmp[i]); //写入源文件同时屏幕输出 if(ChocNum1 != 1 ) { fprintf(fpDest,"\\n", ATmp[i]); //将换行符写入源文件中 printf("\\n",ATmp[i]); //写入源文件同时屏幕输出 } TotalStrP++; } } } //数据处理结果输出提示 printf("\\n\\n 此文件原文件有 %d 条字符串,共 %d KB \\n\\n 现在有字符串 %d 去除重复记录%d \\n\\n", TotalStrO, TotalSize/1024+1, TotalStrP, TotalStrO-TotalStrP); } //@@@@@ @@@@@ 文本排序去重主体 结尾位置 @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ //222.4. //@@@@@ @@@@@ 文本列选择排序主体 起始位置 @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ { //除main函数公共部分,以及几个构造函数 Str_Len 部分,可直接引用 // 从文本中选择某个或某些字符串列 按照输入列序的顺序输出对应列在新文本中 // 如原文本有7列要求新文本列序为: 5 4 7 3 1 6 2,则依次输入参数即可,如果某列不想输出则在循环到该列时输入0 即可 int lineNum=1, SelectNum[101], ChoiceNum=1, i, j, Selectj=0, TotalSizeO=0, k=0, TotalStrO=0, TotalStrP=0, TotalSizeP=0; char TmpSelect[102][ANum1]; for(i=0;i<101;i++) //选择列号数组初始化 SelectNum[i]=0; printf("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n 请输入原文本的列数 (不大于100列) Enter键确认\\n\\n 或原文本每几个字符串算一列 \\n 每行列数为:\"); scanf("%d",&lineNum); printf("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n 请依次输入需要输出的列号,不输出该列请按 0 \\n\\n"); for(i=1; i printf("\\n 请输入 \ Enter键确认\\n\\n 输出文本第%d列在原文本列号为: \",i); scanf("%d",&SelectNum[i]); } i=0,j=1; while (fscanf(fpSrc,"%s",TmpSelect[j])!=EOF) //一个周期的字符串数据依次存入对应的循环数j对应位置 { i++; j++; //j 参数用于实现一个周期的字符串输入到字符串数组中进行缓存 if(j == lineNum+1) //当j循环达到一个周期时,进入一个相同长度周期的k循环输出,并在该周期循环结尾处对j初始化为1 { k = 0; while(k < lineNum) //一个输出周期,用k计数 { k++; Selectj = SelectNum[k]; //数组第k个位置正好存储着第k次输出所需要的字符串缓存位置下标,取出下标给Selectj if(Selectj != 0) { printf("%s",TmpSelect[Selectj]); fprintf(fpDest,"%s",TmpSelect[Selectj]); if((k % lineNum) != 0) { printf(" "); fprintf(fpDest," "); } TotalStrP ++ ; TotalSizeP += Str_Len(TmpSelect[Selectj]); } TotalSizeO += Str_Len(TmpSelect[Selectj]); } //选择输出思想原理,按周期:一个周期输入、一个周期输出。输入时将一个周期的字符串依次存入字符串数组,即每个字符串都对应相应的列。 j = 1; //再取一个整型数组用于依次存储输出的列号,在输出周期时按整型数组的顺序循环,依次取出列号,输出对应位置数组中的字符串 printf("\\n"); //原理:按顺序存入缓存,按下标所在数组顺序输出对应字符串 fprintf(fpDest,"\\n"); } } TotalStrO = i; printf("\\n\\n 此文件原文件有 %d 条字符串,共 %d KB \\n\\n", TotalStrO, TotalSizeO/1024+1); printf("\\n\\n 现在以选择的字符串有 %d 个,共 %d KB \\n\\n",TotalStrP, TotalSizeP/1024+1); } //@@@@@ @@@@@ 文本列选择排序主体 结尾位置 @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ if( ProScanf_j == 5 ) // 222.5. //@@@@@ @@@@@ 文本加密、解密 起始位置 @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ {//除main函数公共部分,以及几个构造函数 Str_Len 部分,可直接引用 int i=0, Select=0, TotalSizeO=0, TotalStrO=0; char szTmp[ANum1], key[ANum1]; printf("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n 请选择操作 1.加密 2.解密 Enter键确认。\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\"); scanf("%d",&Select); if(Select==1) printf("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n 请输入加密的密码 Enter键确认。\\n\\n\\n\\n\\n\\n\\n\\n\\n\\"); if(Select==2) printf("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n 请输入解密的密码 Enter键确认。\\n\\n\\n\\n\\n\\n\\n\\n\\n\\"); scanf("%s",key); printf("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"); if(Select==1) { while(fgets(szTmp, ANum1-1 , fpSrc)) { i++; AL_Lock(szTmp, key); fputs(szTmp,fpDest); printf("%s",szTmp); TotalSizeO += Str_Len(szTmp); } } if(Select==2) { while(fgets(szTmp, ANum1-1 , fpSrc)) { i++; LA_Key(szTmp, key); fputs(szTmp,fpDest); printf("%s",szTmp); TotalSizeO += Str_Len(szTmp); } } TotalStrO = i; printf("\\n\\n 此文本有 %d 行,共 %d KB \\n\\n", TotalStrO, TotalSizeO/1024+1); } //@@@@@ @@@@@ 文本加密、解密 结尾位置 @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ if( ProScanf_j == 6 ) // 222.6. //@@@@@ @@@@@ 字符替换与删除 起始位置 @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ {//除main函数公共部分,以及几个构造函数 Str_Len 部分,可直接引用 int i=0, ChNum=0, TotalSizeO=0, TotalStrO=0; char szTmp0[ANum1], szTmp1[ANum1]="",szTmp2[ANum1]=""; printf("\\n\\n\\n\\n\\n\\n 请选择需要进行的操作:\\n\\n 1.字符替换 2.字符删除 Enter键确认。\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\"); scanf("%d",&ChNum); if(ChNum==1) { printf("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n 请输入需要被替换的字符 Enter键确认。\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\"); scanf("%s",&szTmp1); printf("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n 请输入用于替换的字符 Enter键确认。\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\"); scanf("%s",&szTmp2); } if(ChNum==2) { printf("\\n\\n\\n\\n\\n\\n 请输入需要被删除的字符 Enter键确认。\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\"); scanf("%s",&szTmp1); } while(fgets(szTmp0, ANum1-1 , fpSrc)) { i++; Str_Rep(szTmp0, szTmp1, szTmp2); fputs(szTmp0,fpDest); printf("%s",szTmp0); TotalSizeO += Str_Len(szTmp0); } TotalStrO = i; printf("\\n\\n 此文本共有 %d 行,共 %d KB \\n\\n", TotalStrO, TotalSizeO/1024+1); } //@@@@@ @@@@@ 字符替换与删除 结尾位置 @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ //333.《main函数部分》 //333.1. //@@@@@ @@@@@ main函数主体 开始位置 @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ //可直接引用 int main(int argc,char* argv())//此为cmd窗口打开应用exe程序main函数形式,argc为输入参数个数,argv[i]为在cmd输入的第i个参数,argv[0]为应用程序名 argv[1]可设置为第1个文件物理地址及名称PhyName argv[2]第2个 { int ProScanf_j = 3, i; char PhyName[ANum1] ; FILE * fpSrc, * fpDest; do { i=0; fpSrc = NULL; while(fpSrc == NULL) //为了暂停以便输入 while循环在遇到while循环时才暂停给予输入时间,不用改循环,do while第二次循环时会跳过输入 { i++; if(i == 1) printf("\\n\\n\\n\\n\\n\\n\\\ zhou++ \\n\\n\\n 请输入需要处理的文本文件的物理地址及名称,\\n\\n 如 d:\\\\mycc\\\函数.txt \\ 退出请按 0 \\n\\n Enter键确认。\\n\\n\\n\\n\\n\\n\\n\\n\\"); else printf("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n 文件打开失败\\n\\n 文件不存在 或路径输入有误 \\n\\n\\n\\n\\n\\n 请重新输入需要处理的文本文件的物理地址及名称,\\n\\n\\n 如 d:\\\\mycc\\\函数.txt 退出请按 0 \\n\\n Enter键确认。\\n\\n\\n\\n\\n\\n\\n\\n\\n\\");
