2016-06-13 3 views
-4

мой первый раз здесь, я очень начинающий студент в программировании, и у меня есть проблема, на которую я не могу найти решение. Я пишу код, чтобы сделать шифр vigenere, но у меня проблемы с ним:C Прокрутите небольшой массив и добавьте в большой массив

Первый: ввод ключа, скажем, что ключ; «Ааа»

Второе: Текст должен быть зашифрован, скажем, что текст:»Аллигатор»

Шифр ​​должен быть:

аллигатора

+

ааа | ааа | aaa (ключ для повторного запуска каждой дополнительной буквы в тексте против ключа)

a + a зашифрованное первое письмо; б

всего текст:

bmmjhbups

Моя проблема заключается в том, чтобы перебрать аллигатор с коротким аЬсом? Во всех моих попытках abc становится равным нулю, когда цикл пропускает его вместо начала с начала, когда цикл для текста передается длиной abc. Я также попытался с помощью strcpy и concatenate, так что abc становится одной и той же длиной строки на аллигаторе, но я встречаю проблемы в методах strcpy и cat из-за странных символов в попрошайничестве строки. У любого есть легкое решение относительно того, как петля может работать через больший цикл?

+0

Не могли бы вы предоставить код, чтобы мы могли лучше помочь вам? – bpinhosilva

+0

просто используют индекс строки текста по модулю keylength как индекс для ключа, например. 'cypher = plain [i] + key [i% keylength]' –

ответ

0

Хотя я, вероятно, не должен публиковать это (так как образец кода не был предоставлен), вот фрагмент кода, который делает то, что вы хотите. Тем не менее, пара идей:

  • Согласно Vigenere wiki, каждая буква имеет номер, связанный с ним:

    • .. 0
    • б .. 1
    • ...
    • z ..25

    и при добавлении 2 буквы добавляются их значения, а затем % 26 (по модулю) применяется к результату. Например. «» + «» = (0 + 0)% 26 = 0, который также (который отличается от б что вы ожидаете), поэтому мне пришлось добавить CUSTOM_OFFSET перемену каждый результат из таблицы (вперед) на 1.

  • Шифр ​​работает либо с верхним, либо с нижним регистром, а не с обоими (или любыми другими символами). Вероятно, могут быть добавлены некоторые процедуры проверки text и key. В любом случае в этом случае используются строчные буквы.

Код:

#include <stdio.h> 
#include <string.h> 
#include <malloc.h> 

#define BASE_CHR 'a' //Change it to 'A' if working with uppercases (can't have both) 
#define ALPHABET_LEN ('z' - 'a' + 1) 

#define CUSTOM_OFFSET 1 //According to specs should be 0, but it wouldn't match the current requirements 

int main() { 
    char *text = "alligator", *key = "aaa", *new_text = NULL; 
    size_t text_len = strlen(text), key_len = strlen(key), i = 0; 
    if ((new_text = (char*)calloc(text_len + 1, sizeof(char))) == NULL) { 
     printf("Malloc error\n"); 
     return 1; 
    } 
    for (i = 0; i < text_len; i++) 
     new_text[i] = ((text[i] - BASE_CHR + key[i % key_len] - BASE_CHR + CUSTOM_OFFSET) % ALPHABET_LEN) + BASE_CHR; 
    printf("Text: %s, Key: %s, Crypted: %s\n", text, key, new_text); 
    free(new_text); 
    new_text = NULL; 
    return 0; 
} 

Выход:

Текст: аллигатор, ключ: ааа, Кодированные: bmmjhbups

+0

HI, спасибо, за ваше время и ввод, очень ценится. Вы правильно относитесь к a + a = a. Я думаю, что есть некоторая полезная информация для меня, чтобы использовать ее для решения моей проблемы. – lkoks

0

Пожалуйста, взгляните на эту программу. Я думаю, он делает то, что вы хотите.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

#define NUMLETTERS 26 
#define BUFSIZE 4096 

char *get_input(void); 

int main(int argc, char *argv[]) 
{ 
    char sign = 1; 
    char const plainmsg[] = "Plain text: "; 


    // Convert argument into array of shifts 
    char const *const restrict key = "bbb"; 
    size_t const keylen = strlen(key); 
    char shifts[keylen]; 

    char const *restrict plaintext = NULL; 
    for (size_t i = 0; i < keylen; i++) { 
     if (!(isalpha(key[i]))) { 
      fprintf(stderr, "Invalid key\n"); 
      return 2; 
     } 
     char const charcase = (char) (isupper(key[i])) ? 'A' : 'a'; 
     // If decrypting, shifts will be negative. 
     // This line would turn "bacon" into {1, 0, 2, 14, 13} 
     shifts[i] = (key[i] - charcase) * sign; 
    } 

    do { 
     fflush(stdout); 
     // Print "Plain text: " if encrypting and "Cipher text: " if 
     // decrypting 
     printf("%s", plainmsg); 
     plaintext = get_input(); 
     if (plaintext == NULL) { 
      fprintf(stderr, "Error getting input\n"); 
      return 4; 
     } 
    } while (strcmp(plaintext, "") == 0); // Reprompt if entry is empty 

    size_t const plainlen = strlen(plaintext); 

    char* const restrict ciphertext = calloc(plainlen + 1, sizeof *ciphertext); 
    if (ciphertext == NULL) { 
     fprintf(stderr, "Memory error\n"); 
     return 5; 
    } 

    for (size_t i = 0, j = 0; i < plainlen; i++) { 
     // Skip non-alphabetical characters 
     if (!(isalpha(plaintext[i]))) { 
      ciphertext[i] = plaintext[i]; 
      continue; 
     } 
     // Check case 
     char const charcase = (isupper(plaintext[i])) ? 'A' : 'a'; 
     // Wrapping conversion algorithm 
     ciphertext[i] = ((plaintext[i] + shifts[j] - charcase + NUMLETTERS) % NUMLETTERS) + charcase; 
     j = (j+1) % keylen; 
    } 
    ciphertext[plainlen] = '\0'; 
    printf("%s\n", ciphertext); 

    free(ciphertext); 
    // Silence warnings about const not being maintained in cast to void* 
    free((char*) plaintext); 
    return 0; 
} 
char *get_input(void) { 

    char *const restrict buf = malloc(BUFSIZE * sizeof (char)); 
    if (buf == NULL) { 
     return NULL; 
    } 

    fgets(buf, BUFSIZE, stdin); 

    // Get rid of newline 
    size_t const len = strlen(buf); 
    if (buf[len - 1] == '\n') buf[len - 1] = '\0'; 

    return buf; 
} 

Тест

Plain text: alligator 
bmmjhbups 

Однако, я думаю, что вы, возможно, не поняли ключ, ключ aaa оставит обычный текст без изменений, если я правильно понял, но ключ bbb сместит позицию один шаг вниз в алфавите. Посмотрите на угловые случаи, такие как смещение Z вниз или смещение A вверх.

+0

HI, спасибо за ваше время и ввод. Вы правы в отношении ключа aaa = 0. – lkoks

Смежные вопросы