2015-12-05 6 views
0

Я работаю над программой шифрования для класса в C. Я использую математику по модулю 27 для выполнения шифрования. Я добавляю каждый зашифрованный символ в массив, но я заметил, что в конце строки добавляются непечатаемые символы. Я понял это, когда я проверил количество слов зашифрованного текста и содержал больше символов, чем исходный текст, который был зашифрован. Может ли кто-нибудь объяснить, почему это происходит? Это учитывает новую строку в конце текстов.Непечатаемые символы, прикрепленные к строке

Plaintext = THE RED GOOSE FLIES AT MIDNIGHT STOP - wc is 37 
Ciphertext = ACBVKWNOGMMMPQHNI XL QBJXDPNVIQVSNZN - wc is 40 

//Go through each character of the plaintext 
    for (i = 0; i < size; i++) 
    { 
     //Convert the characters to an integer 
     PlainNums[i] = charInt(plaintext[i]); 
     KeyNums[i] = charInt(key[i]); 

    //Add the int from plain text and the key together 
    CipherNums[i] = PlainNums[i] + KeyNums[i]; 
    if (CipherNums[i] > 27) //Wrap around if the number exceeds 27 
    { 
     CipherNums[i] -= 27; 
    } 
    CipherNums[i] = CipherNums[i] % 27; //Use modulo 27 math to generate a new integer 

    cipherText[i] = IntChar(CipherNums[i]); 
} 

    int charInt(char c) 
    { 
    switch (c) 
    { 
    case 'A': return 0; 
    case 'B': return 1; 
    case 'C': return 2; 
    case 'D': return 3; 
    case 'E': return 4; 
    case 'F': return 5; 
    case 'G': return 6; 
    case 'H': return 7; 
    case 'I': return 8; 
    case 'J': return 9; 
    case 'K': return 10; 
    case 'L': return 11; 
    case 'M': return 12; 
    case 'N': return 13; 
    case 'O': return 14; 
    case 'P': return 15; 
    case 'Q': return 16; 
    case 'R': return 17; 
    case 'S': return 18; 
    case 'T': return 19; 
    case 'U': return 20; 
    case 'V': return 21; 
    case 'W': return 22; 
    case 'X': return 23; 
    case 'Y': return 24; 
    case 'Z': return 25; 
    case ' ': return 26; 
    default: return -1; 
    } 
} 

char IntChar(int n) 
{ 
    switch(n) 
    { 
    case 0: return 'A'; 
    case 1: return 'B'; 
    case 2: return 'C'; 
    case 3: return 'D'; 
    case 4: return 'E'; 
    case 5: return 'F'; 
    case 6: return 'G'; 
    case 7: return 'H'; 
    case 8: return 'I'; 
    case 9: return 'J'; 
    case 10: return 'K'; 
    case 11: return 'L'; 
    case 12: return 'M'; 
    case 13: return 'N'; 
    case 14: return 'O'; 
    case 15: return 'P'; 
    case 16: return 'Q'; 
    case 17: return 'R'; 
    case 18: return 'S'; 
    case 19: return 'T'; 
    case 20: return 'U'; 
    case 21: return 'V'; 
    case 22: return 'W'; 
    case 23: return 'X'; 
    case 24: return 'Y'; 
    case 25: return 'Z'; 
    case 26: return ' '; 
    default: return '!'; //error 
} 

} 
+1

Сообщение [MCVE] (http://stackoverflow.com/help/mcve), пожалуйста. – MikeCAT

+0

'if (CipherNums [i]> 27)' -> 'if (CipherNums [i]> = 27)' Все же следующее: CipherNums [i] = CipherNums [i]% 27; 'отрицает необходимость в этом. – chux

+0

дать полный код, чтобы увидеть –

ответ

1

Попытка добавления cipherText[size] = '\0'; в конце цикла, чтобы убедиться, что строка в кодировке содержат только закодированные данные.

+1

К сожалению, это не поможет. Я даже cipherText [size] = '\ 0'; до конца цикла, и он все еще добавляет ненужные символы. – user2466886

+1

Это сработало, когда я сделал cipherText [size - 1] = '\ 0' – user2466886

0

Инициализировать cipherText до forloop используя memset в вашем коде, как следующим образом.

memset(cipherText,0,sizeof(cipherText)); 

for (i = 0; i < size; i++) 
    { 
     //Convert the characters to an integer 
     PlainNums[i] = charInt(plaintext[i]); 
     //.... 
    // rest of the code 

Необходимо, чтобы include<string.h. И это работает.

+0

ответ, если работает @ user2466886 –

+1

Нет, что не работает - когда я использую слово count the file я выводю, что он все еще говорит 40 символов вместо 37 – user2466886

+0

дает полную ссылку кода в 'idone.com' –