C++ 编程,编写一个程序,通过根据输入键重新排列输入字符串中的字符来加密用户输入消息,求代码

编写一个程序,通过根据输入键重新排列输入字符串中的字符来加密用户输入消息(少于1000个字符)。键包含n个(最多10个)连续整数(范围从0到n-1),这些整数指示重新排列的位置。请注意,输入键可以以0开头。
过程说明
消息:SEHH2042 Computer Programming is very EASY~!!
钥匙:3596047218
加密:
首先,每隔n个字符(n是键长)中断消息,并将其排列成行。每行有n个字符。最后几个空插槽中充满了空格。然后根据键,将列重新排列到新的列位置,即,将第0列放到第3列,将第1列放到第5列,将第2列放到第9列,依此类推…
最后,合并行以获取下面的加密文本。
加密:2 2S0EH4CHtP oemurrpmgnomgai reE irsvyA ! S Y! ~
如图所示。内容以英文为准。

谢邀。

根据第二张图中的过程解释,可以对加密过程进行理解:

首先,每n个字符一行,构建出如图的矩阵。按照密钥顺序进行重新排序。最后合成一个字符串进行输出。我这里将这道题看成每n个字符一组,就不构建二维数组了,按照key指定顺序进行输出。其中实际上顺序就是key的值从小到大排序后的索引顺序。我这里就是用上述流程了,具体说明已经附在图例,请看注释。我没有重新建立二维数组来做,也可以考虑通过字符串,拆分成二维数组,再重新根据key的索引顺序再构建一个新的二维数组,再按顺序输出。这里就给定一种方法了哈,我这种方法就是对空间要求相对少,可能不一定直观,请参考:


参考代码如下

#include <iostream>

#include "Math.h"

using namespace std;

int main(){

char cl[1000] = {' '}, key[11] = {'\0'};

int col = 0, maxCharNum = 0, maxKeyNum = 0, keyIndex[10] = { 0 };;

//获取字符串并找到字符串的数量

cin >> noskipws;

do {

cin >> cl[col++];

} while (cl[col - 1] != '\n');

cl[col - 1] = ' ';//把换行替换成空格

maxCharNum = col-1;

//输入并寻找key的长度,并找到正确index顺序

cin >> key;

for (int i = 0; i < 11; i++) {

if (key[i] == '\0') {

maxKeyNum = i;

break;

}

}

for(int i=0;i<maxKeyNum;i++)

for(int j = 0; j < maxKeyNum; j++)

if ((key[j] - '0') == i){

keyIndex[i] = j;

break;

}

//每一个分组,其起点一定是key的长度的整数倍

for (int start = 0; start < maxCharNum; start += maxKeyNum) {

//在每组内进行循环,每行就是maxKeyNum个元素

for (int i = 0; i < maxKeyNum; i++) {   //打印字符对应原字符串的位置:

col = start + keyIndex[i];

col > maxCharNum ? cout << ' ' : cout << cl[col];

}

}

}

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-04-29

#include <iostream>

#include <string>


int main() {


  std::string s, key;

  getline(std::cin, s);

  getline(std::cin, key);

  int lenS = s.length();

  int lenKey = key.length();

  if (lenS % lenKey)

    for (int i = 0; i < (lenKey - lenS % lenKey); i++)

      s.append(" ");

  lenS = s.length();


  std::string tmp = s;

  for (int i = 0; i < lenS ; i++)

    tmp[key[i % lenKey] - '0' + lenKey * (i / lenKey)] = s[i];


  std::cout << tmp << std::endl;

  return 0;

}

第2个回答  2020-04-29
#include <iostream>
#include <string>
using namespace std;

void main()
{
string msg, key, result;
int keyl, msgl;
msg = "SEHH2042 Computer Programming is very EASY~!!";
key = "3596047218";
keyl = key.length();
msgl = msg.length();
int spaces = keyl - (msgl % keyl);

while(spaces--) msg.append(" ");

result = msg;

int pos = 0;

for(auto &i : msg) {
int tmp = key[pos % keyl] - '0' + (pos++ / keyl) * keyl;
result[tmp] = i;
}

cout << result << endl;
}

C++ 编程,编写一个程序,通过根据输入键重新排列输入字符串中的字符来...
首先,每n个字符一行,构建出如图的矩阵。按照密钥顺序进行重新排序。最后合成一个字符串进行输出。我这里将这道题看成每n个字符一组,就不构建二维数组了,按照key指定顺序进行输出。其中实际上顺序就是key的值从小到大排序后的索引顺序。我这里就是用上述流程了,具体说明已经附在图例,请看注释。我没...

c++编程,怎么让玩家输入数字又可以字母,又可以输入字符串
方法:先将输入的数据保存到字符串中,如果输入的是数字,可以通过atoi()函数转换成数字。扩展:atoi( ) 函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\\0')才结束转换,...

用C++编写程序,通过键盘输入一个整数,一个字符和一个字符串到相应的变量...
} 输入:123 A Dengtao 输出:int is: 123 char is: A string is: Dengtao

字符串怎样在c++中输入
首先,我们创建一个Visual Studio项目。接着,我们在项目中添加一个新的C++文件。然后,我们需要定义一个字符数组,用于存储用户输入的字符串。接下来,利用cout和cin函数进行交互,提示用户输入字符串,并接收键盘输入。我们还可以利用cout函数将用户输入的内容显示出来。最后,运行程序,用户可以输入内容并看...

如何用devC++编程实现输入字符串?
1、首先我们新建一个dev C++的项目。2、接下来在项目中新建C语言程序文件。3、然后在C语言文件中声明一个字节数组。4、接下来我们通过printf函数提示用户输入字符串,通过scanf接收用户输入的字符串。5、接着在通过printf函数输出用户输入的内容。6、最后运行C语言程序,我们输入内容以后就可以输出了。在C...

求一道C++试题答案:编写一个程序判定一个键盘输入字符在键盘输入字符...
void main(void){ char Str[121],cx,*p=Str;int n=0;cout << "请输入一个字符串(限长120)...\\nStr=";cin >> Str;cout << "请输入要查找的字符...\\nChr=";cin >> cx;for(;*p;p++)if(*p==cx) n+=1;cout << "字符串" << Str << "中有" << n << "个字符" <<...

用C++编写一个程序,实现将用户输入的一个字符串中的所有字符‘c’删除...
程序代码及运行截图如下:#include using namespace std;int main(){ char s[200],*p,*q; cin.get(s,200); for(p=q=s;*p;p++)if(*p!='c')*q++=*p;*q=*p;cout<<s<<endl; return 0;}

C++编程 从键盘输入一串字符串,程序输出同样的一串字符,要求输出字符...
include<iostream>#include<string.h>using namespace std;void ZhuanHuan(char &); \/\/不需要返回值int main(){ char a[100]; cout<<"please input a string: "<<endl; cin>>a; for(int i=0;i<strlen(a);i++) { ZhuanHuan(a[i]); } for(int j=0;j...

C++编程题:编写一个函数,求一个字符串的长度,在main函数中输入字符串...
if (i >= N) {\/\/当超出字符串长度时, 继续接受键盘输入的字符,直到输入\\n为止 \/这是为了防止字符串输入完成后输入的字符会被下一个需要输入的数据接收 continue;} if (ch == '\\n' || i == N - 1) { p[i] = '\\0';continue;} p[i] = ch;} printf("这个字符串为:%s\\n", ...

...上输入一个字符串,放在数组中,要求将字符串中的大写字母转换成小写...
int main() { std::string input;\/\/ 提示用户输入字符串 std::cout << "请输入一个字符串: ";std::getline(std::cin, input);\/\/ 遍历字符串并进行大小写字母转换 for (char &c : input) { if (std::isupper(c)) { c = std::tolower(c); \/\/ 如果是大写字母,转换为小写字母 ...

相似回答