簡體   English   中英

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

[英]How to repeat characters in a string C

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;

}

有一種簡單的方法可以遍歷一個較短的數組,而同時運行一個較長的數組:只需使用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是一個函數,它表示對一個字符進行編碼所需的任何計算。
您不必編寫此類函數,只需在計算中使用其參數即可。

很多小時后我就完成了,唯一需要做的就是簡單的百分號(%)。

#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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM