2016-07-29 3 views
-3

Я пытаюсь обфускать слово, которое хранится в строке, и мой код иногда работает, а иногда нет. Вот мой код:Странный символ появляется на выходе

// main function 
int main(int argc, string argv[]) 
{ 
    string k, plaintext; 
    int size, i = 0, key = 0; 
    k = argv[1]; 
    size = strlen(k); 
    if (argc < 2 || !isNummeric(k, size) || k < 0) 
     return 1; 
    else 
    plaintext = GetString(); 
    size = strlen(plaintext); 
    char ciphertext[size]; 
    key = atoi(k); 
    while(i < size) 
    { 
     if (isalpha(plaintext[i])) 
     { 
      encipher(key, i, &ciphertext[i], plaintext); 
     } 
     else 
     { 
      ciphertext[i] = plaintext[i]; 
     } 
     i++; 
    } 
    printf("%s\n",ciphertext); 
} 

Ключ от пользователя принимается перекладывать каждую букву, и мне нужно, чтобы проверить, является ли ключ числовое значение или нет, поэтому я сделал isNummeric функцию, чтобы сделать

bool isNummeric(string k, int size) 
{ 
    int c=0; 
    for(int i=0; i<size; i++) 
    { 
     if(!isdigit(k[i])) 
     c++; 
    } 
    if(c==0) 
    return true; 
    return false; 
} 

Теперь, чтобы зашифровать я сделал функцию, чтобы переместить каждую букву:

void encipher(int k, int i, char *pt, string plaintext) 
{ 
    int p, c; 
    if(islower(plaintext[i])) 
    { 
     p=plaintext[i]-'a'; 
     c=(p+k)%26; 
     *pt=c+97; 
    } 
    else 
    { 
     p=plaintext[i]-'A'; 
     c=(p+k)%26; 
     *pt=c+65; 
    } 
} 

here is my output

+5

Первое наблюдение, вы ссылаетесь на 'argv [1]' перед тем, как вы проверите 'argc'. Что такое 'string'? Пожалуйста, покажите [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve), который показывает, что вы пробовали. –

+1

'char ciphertext [size];' слишком короткий и не уничтожен. Изменение этого параметра на 'char ciphertext [size + 1] = {0};' должно помочь. –

+0

Например, предположим, что секретный ключ, k, равен 13, а открытый текст p - это «Обязательно выпивайте свой Овалтин!». Давайте зашифруем это p с этим k, чтобы получить зашифрованный текст c, повернув каждую букву в p на 13 мест, в результате чего: Обязательно выпейте свой Овалтин! будет: Или fher gb qevax lbhe Binygvar! , но несколько раз он печатает что-то вроде изображения, которое я загрузил –

ответ

0

Сборка нескольких замечаний от вопроса в основной код дает следующий код, который, кажется, работает:

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

static bool isNumeric(string k, int size) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     if (!isdigit((unsigned char)k[i])) 
      return false; 
    } 
    return true; 
} 

/* There are too many arguments to this function - but it works */ 
static void encipher(int k, int i, char *pt, string plaintext) 
{ 
    int p, c; 
    if (islower((unsigned char)plaintext[i])) 
    { 
     p = plaintext[i] - 'a'; 
     c = (p + k) % 26; 
     *pt = c + 'a'; 
    } 
    else 
    { 
     p = plaintext[i] - 'A'; 
     c = (p + k) % 26; 
     *pt = c + 'A'; 
    } 
} 

int main(int argc, string argv[]) 
{ 
    string k = argv[1]; 
    if (argc < 2 || !isNumeric(k, strlen(k))) 
     return 1; 
    string plaintext = GetString(); 
    int size = strlen(plaintext); 
    char ciphertext[size + 1]; 
    int key = atoi(k); 
    for (int i = 0; i < size; i++) 
    { 
     if (isalpha(plaintext[i])) 
     { 
      encipher(key, i, &ciphertext[i], plaintext); 
     } 
     else 
     { 
      ciphertext[i] = plaintext[i]; 
     } 
    } 
    ciphertext[size] = '\0'; 
    printf("%s\n", ciphertext); 
} 

Программа называлась csr13, и дает следующие результаты:

$ csr13 4 
The Quick Brown Fox Jumped Over The Lazy Dog 
Xli Uymgo Fvsar Jsb Nyqtih Sziv Xli Pedc Hsk 
$ csr13 22 
Xli Uymgo Fvsar Jsb Nyqtih Sziv Xli Pedc Hsk 
The Quick Brown Fox Jumped Over The Lazy Dog 
$ 

Лучший дизайн для функция encipher передала бы один символ плюс смещение «ключа» и вернула бы зашифрованный символ:

#include <assert.h> 
#include <cs50.h> 
#include <ctype.h> 
#include <stdio.h> 
#include <string.h> 

static bool isNumeric(string k, int size) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     if (!isdigit((unsigned char)k[i])) 
      return false; 
    } 
    return true; 
} 

static int encipher(int k, int c) 
{ 
    assert(isalpha(c)); 
    if (islower(c)) 
     return (c - 'a' + k) % 26 + 'a'; 
    else 
     return (c - 'A' + k) % 26 + 'A'; 
} 

int main(int argc, string argv[]) 
{ 
    string k = argv[1]; 
    if (argc < 2 || !isNumeric(k, strlen(k))) 
     return 1; 
    string plaintext = GetString(); 
    int size = strlen(plaintext); 
    char ciphertext[size + 1]; 
    int key = atoi(k); 
    for (int i = 0; i < size; i++) 
    { 
     if (isalpha(plaintext[i])) 
      ciphertext[i] = encipher(key, plaintext[i]); 
     else 
      ciphertext[i] = plaintext[i]; 
    } 
    ciphertext[size] = '\0'; 
    printf("%s\n", ciphertext); 
} 
Смежные вопросы