【第八週專案4-字串加密】
阿新 • • 發佈:2019-02-12
問題及程式碼:
/*
* Copyright (c) 2016, 煙臺大學計算機與控制工程學院
* All rights reserved.
* 檔名稱:Cube007.cpp
* 作 者:劉小楠
* 完成日期:2016年10月20日
*
* 問題描述:一個文字串可用事先編制好的字元對映表進行加密。
* 輸入描述:原文
* 輸出描述:密文及解密
*/
sqString.h
#ifndef SQSTRING_H_INCLUDED #define SQSTRING_H_INCLUDED #define MaxSize 100 //最多的字元個數 typedef struct { char data[MaxSize]; //定義可容納MaxSize個字元的空間 int length; //標記當前實際串長 } SqString; void StrAssign(SqString &s,char cstr[]); //字串常量cstr賦給串s void StrCopy(SqString &s,SqString t); //串t複製給串s bool StrEqual(SqString s,SqString t); //判串相等 int StrLength(SqString s); //求串長 SqString Concat(SqString s,SqString t); //串連線 SqString SubStr(SqString s,int i,int j); //求子串 SqString InsStr(SqString s1,int i,SqString s2); //串插入 SqString DelStr(SqString s,int i,int j) ; //串刪去 SqString RepStr(SqString s,int i,int j,SqString t); //串替換 void DispStr(SqString s); //輸出串 #endif // SQSTRING_H_INCLUDED
sqString.cpp
#include <stdio.h> #include <malloc.h> #include "SqString.h" void StrAssign(SqString &s,char cstr[]) //s為引用型引數 { int i; for (i=0;cstr[i]!='\0';i++) s.data[i]=cstr[i]; s.length=i; } void StrCopy(SqString &s,SqString t) //s為引用型引數 { int i; for (i=0;i<t.length;i++) s.data[i]=t.data[i]; s.length=t.length; } bool StrEqual(SqString s,SqString t) { bool same=true; int i; if (s.length!=t.length) //長度不相等時返回0 same=false; else for (i=0;i<s.length;i++) if (s.data[i]!=t.data[i]) //有一個對應字元不相同時返回0 { same=false; break; } return same; } int StrLength(SqString s) { return s.length; } SqString Concat(SqString s,SqString t) { SqString str; int i; str.length=s.length+t.length; for (i=0;i<s.length;i++) //將s.data[0..s.length-1]複製到str str.data[i]=s.data[i]; for (i=0;i<t.length;i++) //將t.data[0..t.length-1]複製到str str.data[s.length+i]=t.data[i]; return str; } SqString SubStr(SqString s,int i,int j) { SqString str; int k; str.length=0; if (i<=0 || i>s.length || j<0 || i+j-1>s.length) return str; //引數不正確時返回空串 for (k=i-1;k<i+j-1;k++) //將s.data[i..i+j]複製到str str.data[k-i+1]=s.data[k]; str.length=j; return str; } SqString InsStr(SqString s1,int i,SqString s2) { int j; SqString str; str.length=0; if (i<=0 || i>s1.length+1) //引數不正確時返回空串 return str; for (j=0;j<i-1;j++) //將s1.data[0..i-2]複製到str str.data[j]=s1.data[j]; for (j=0;j<s2.length;j++) //將s2.data[0..s2.length-1]複製到str str.data[i+j-1]=s2.data[j]; for (j=i-1;j<s1.length;j++) //將s1.data[i-1..s1.length-1]複製到str str.data[s2.length+j]=s1.data[j]; str.length=s1.length+s2.length; return str; } SqString DelStr(SqString s,int i,int j) { int k; SqString str; str.length=0; if (i<=0 || i>s.length || i+j>s.length+1) //引數不正確時返回空串 return str; for (k=0;k<i-1;k++) //將s.data[0..i-2]複製到str str.data[k]=s.data[k]; for (k=i+j-1;k<s.length;k++) //將s.data[i+j-1..s.length-1]複製到str str.data[k-j]=s.data[k]; str.length=s.length-j; return str; } SqString RepStr(SqString s,int i,int j,SqString t) { int k; SqString str; str.length=0; if (i<=0 || i>s.length || i+j-1>s.length) //引數不正確時返回空串 return str; for (k=0;k<i-1;k++) //將s.data[0..i-2]複製到str str.data[k]=s.data[k]; for (k=0;k<t.length;k++) //將t.data[0..t.length-1]複製到str str.data[i+k-1]=t.data[k]; for (k=i+j-1;k<s.length;k++) //將s.data[i+j-1..s.length-1]複製到str str.data[t.length+k-j]=s.data[k]; str.length=s.length-j+t.length; return str; } void DispStr(SqString s) { int i; if (s.length>0) { for (i=0;i<s.length;i++) printf("%c",s.data[i]); printf("\n"); } }
main.cpp
#include <stdio.h> #include "sqString.h" SqString A,B; //用於儲存字元對映表 SqString EnCrypt(SqString p) { int i=0,j; SqString q; while (i<p.length) { for (j=0; p.data[i]!=A.data[j]&&j<A.length; j++); if (j>=A.length) //在A串中未找到p.data[i]字母 q.data[i]=p.data[i]; else //在A串中找到p.data[i]字母 q.data[i]=B.data[j]; i++; } q.length=p.length; return q; } SqString UnEncrypt(SqString q) { int i=0,j; SqString p; while (i<q.length) { for (j=0; q.data[i]!=B.data[j]&&j<B.length; j++); if (j>=B.length) //在B串中未找到q.data[i]字母 p.data[i]=q.data[i]; else //在B串中找到q.data[i]字母 p.data[i]=A.data[j]; i++; } p.length=q.length; return p; } int main() { SqString p,q; StrAssign(A,"abcdefghijklmnopqrstuvwxyz"); //建立A串 StrAssign(B,"ngzqtcobmuhelkpdawxfyivrsj"); //建立B串 char str[MaxSize]; printf("輸入原文串:"); gets(str); //獲取使用者輸入的原文串 StrAssign(p,str); //建立p串 printf("加密解密如下:\n"); printf(" 原文串:"); DispStr(p); q=EnCrypt(p); //p串加密產生q串 printf(" 加密串:"); DispStr(q); p=UnEncrypt(q); //q串解密產生p串 printf(" 解密串:"); DispStr(p); printf("\n"); return 0; }
執行結果:
知識點總結:
字串加密
學習心得:
通過最字串加密的實踐,更好的使我對串加深了理解