首页 文章

如何在字符串C中重复字符

提问于
浏览
0

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;

}

2 回答

  • 0

    有一种简单的方法可以循环一个短数组,同时运行一个较长的数组:只需使用modulo % .

    当你分割两个数字时,模数是余数 . 它总是介于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 是一个函数,表示编码一个字符需要执行的任何计算 .
    您不必编写这样的函数,只需在计算中使用其参数即可 .

  • 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;
    
    }
    

相关问题