https://stepik.org/lesson/192229/step/5?unit=166729
任务:使用另一个字符串加密一个字符串,该程序需要2个字符串,第一个用作密钥,另一个则将被加密。密钥字符串按字母顺序使用,例如:A = 0,B =1。第二个字符串中的字符将按字母顺序更改。字母可以是小写或大写字母,因为输出将以大写字母表示。
密钥不能超过15个字符,第二个字符串不能超过30个字符,字符串只能包含字符,否则将给出falsche eingabe(德语翻译=输入错误)
Sample Input 1:
aaaaaaaaaaaaaaaa bob
Sample Output 1:
falsche eingabe
Sample Input 2:
aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
Sample Output 2:
falsche eingabe
Sample Input 3:
zzzz zzzzzz
Sample Output 3:
YYYYYY
Sample Input 4:
hallo welT
Sample Output 4:
DEWE
Sample Input 5:
AbC HaLLo
Sample Output 5:
HBNLP
嗨!我正在尝试找到一种方法来做。虽然我已经做了很多,但是仍然有问题。我已经给Capital写了小写字母,并按字母A = 0 B的顺序写了键字符= 1 c = 2并且我已经确定当字母结束时会转到字母的开头,例如:bb zz => AA
当密钥短于加密字符串时,问题开始。输入为==> cc bbbb时应为==> DDDD但它为DDBB。我需要重复密钥中的字符才能使其对。如果有人帮助我,将非常感谢!!!
#include <stdio.h>
int main() {
char a[30]; // KEY
char b[50]; // encrypted
int i,j,g; // length of char a,b and for loop
scanf("%s %s",&a,b);
for (i = 0; a[i] != '\0'; ++i);
for (j = 0; b[j] != '\0'; ++j); // length found!
if(i>15 || j>30){ //checking if lengths are longer than 15 and 30
printf("falsche eingabe");
return 0;
}
for(g=0;g<i;g++){
if ((a[g] < 'A' || a[g] > 'Z') && (a[g] < 'a' || a[g] > 'z') || (b[g] < 'A' || b[g] > 'Z') && (b[g] < 'a' || b[g] > 'z')) {
printf("falsche eingabe"); // checking if inputs are characters
return 0;
}
} // the end Falsche Eingaben
for (g = 0; g < i; g++) {
if (a[g] >= 'a' && a[g] <= 'z') {
a[g] = a[g] - 32; // small letters become Capital
}
}
for (g = 0; g < j; g++) {
if (b[g] >= 'a' && b[g] <= 'z') {
b[g] = b[g] - 32; // small letters become Capital
}
}
for (g = 0; g < i; g++){
a[g]=a[g]- 65 ; // the number for alphabet z.B A=0 B=1
if(b[g]+a[g] > 'Z'){
b[g] = b[g] - 26;
} b[g]=a[g]+b[g];
}
printf("%s",b);
return 0;
}
答案 0 :(得分:0)
有一种简单的方法可以在较短的数组上循环,同时在较长的数组上运行:只需使用模数%
。
当您将两个数字相除时,余数就是余数。它始终在0到您要除以1的数字之间。 因此,该公式将遍历较小的数组。
使用到较长数组的索引作为较短数组的索引,以较短数组的长度为模。
这里是一个例子:
char *key = "ABC";
char *string = "Thisisalongstringtoencode";
char encoded[100];
int i;
int key_lenght = strlen(key);
for (i = 0; i < strlen(string); i++) {
ecoded[i] = encode_character(string[i], key[i % key_length]);
}
在此示例中,encode_character
是一个函数,表示您需要进行的任何计算以对一个字符进行编码。
您不必编写此类函数,只需在计算中使用其参数即可。
答案 1 :(得分:0)
很多小时后我就完成了。唯一需要的就是一个简单的百分号(%)。
#include <stdio.h>
int main() {
char a[30]; // schluessel
char b[50]; // unverschlüsselter
char c[50]; // verschlüsselter
int i,j,g,e; // für definieren die lange der char a,b
scanf("%s %s",&a,b);
for (i = 0; a[i] != '\0'; ++i);
for (j = 0; b[j] != '\0'; ++j); // Lange gefunden!
if(i>15 || j>30){
printf("falsche eingabe");
return 0;
}
for(g=0;g<i;g++){
if ((a[g] < 'A' || a[g] > 'Z') && (a[g] < 'a' || a[g] > 'z')) {
printf("falsche eingabe");
return 0;
}
} // die Ende für Falsche Eingaben
for(g=0;g<j;g++){
if ((b[g] < 'A' || b[g] > 'Z') && (b[g] < 'a' || b[g] > 'z')) {
printf("falsche eingabe");
return 0;
}
}
for (g = 0; g < i; g++) {
if (a[g] >= 'a' && a[g] <= 'z') {
a[g] = a[g] - 32; // kleine zu große
}
}
for (g = 0; g < j; g++) {
if (b[g] >= 'a' && b[g] <= 'z') {
b[g] = b[g] - 32; // kleine zu große
}
}
for (g = 0; g < i; g++){
a[g]=a[g]- 65 ; // die Zahl für Alphabet z.B A=0 B=1
}
// printf("%d %d\n",i,j);
for(g=0;g<j;g++){
if(j>i){ // wenn die länge der b array ist größer als a array,wir
wiederholen die characters in array
b[g]=b[g]+a[g%i];
} else if (i>j){ // wenn die länge der a array ist größer als b array,nur
addieren
b[g]=a[g]+b[g];
} else {
b[g]=a[g]+b[g];
}
if(b[g]>90){ // wenn die alphabet endet, gehen wir züruck zu anfang
b[g] = b[g] - 26;
}
}
printf("%s",b);
return 0;
}