c - C语言中如何重复字符串中的字符

标签 c string char

https://stepik.org/lesson/192229/step/5?unit=166729

任务:用另一个字符串加密一个字符串。程序需要2个字符串。第一个用作 key ,另一个将被加密。 key 字符串按字母顺序使用,例如: A = 0 , B= 1。第二个字符串中的字符将按字母顺序更改。字母可以是小写字母或大写字母,但这并不重要,因为输出将以大写字母显示。

key 不能超过 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

嗨!我正在尝试找到一种方法来做到这一点。我已经设法做了很多,但仍然有问题。我已经将小写字母改为大写字母,并按照字母表 A=0 B 的顺序编写了按键字符=1 c=2 我已经做到了,当字母表结束时,它会转到字母表的开头,例如: bb zz => AA

当 key 比加密字符串短时,问题就开始了。当输入是==> cc bbbb时,它应该是==> DDDD,但它给出了DDBB。我需要重复 key 中的字符才能使其成功是的。如果有人帮助我,那就太好了!!

#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 和除以负 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 是一个函数,表示对一个字符进行编码所需执行的任何计算。
您不必编写这样的函数,只需在计算中使用它的参数即可。

关于c - C语言中如何重复字符串中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53687506/

相关文章:

c++ - 在一组 27 个浮点值中选择中位数的最快代码 C/C++

c - 在C中,如何将 float 或 double 除以2的i次方?

c++ - 如何基于现有文件数据库创建具有模式的内存数据库

c# - String[0] vs ToCharArray 然后 Char[0]

python - "No module named"。 gdb 中的 Python 错误

ruby - Ruby 中二进制字符串的问题

c - 在字符串C中分配特殊字符

比较 c 输入与 $$ 和 `tty` &

objective-c - 如何在 NSLog() 中打印 unsigned char*

arrays - Ruby - 按类类型对数组进行排序