Странные символы, случайно появляющиеся при преобразовании int arr в строку в C (с действительным ASCII) - PullRequest
0 голосов
/ 06 августа 2020

Это простая реализация шифра Цезаря в C.

Я беру булавку, делаю из нее ключ, беру сообщение, сдвигаю значение ASCII относительно ключа и выводю шестнадцатеричное значение каждый символ в шестнадцатеричном формате.

При использовании (как мне показалось) любого ключа для некоторых (не всех) сообщений при декодировании печатается дополнительный символ.

  • Примеры случаев:

Появляется странный символ:

Сообщение: «hexa !»

Пин: 454545 & Ключ: 23

Зашифрованный текст: (в шестнадцатеричном формате) «51 4e 61 4a 9 a fffffff3 4e -6f» (-6f просто используется для завершения ввода)

Текст, предоставляемый при декодировании:

hexa !
e

Другие ключи генерируют другие странные символы, например, «+». Странный символ всегда появляется на следующей строке.

Весь код составляет ~ 100 строк, поэтому я не буду вставлять его сюда, но он доступен на GitHub . Не используйте windows .exe в этом репо, это более старая версия, я пытаюсь исправить эту проблему перед выпуском этой версии.

Код, в котором, вероятно, возникает проблема, является Функции encrypt () и decrypt ():

void encrypt() {
     char msg[3001], ch;
     int i,key, en[3001], count = 0;

     printf("\n");
     key = pin();
     getchar();
     printf("\nType Message - \n\n");
     fgets(msg,sizeof(msg),stdin);

     for (i=0; msg[i] != '\0'; i++) {
         ch=msg[i];
         int d = (ch - key);
         en[i] = d;
         count++;
     }

     printf("\nEncrypted message -\n\n");

     for (i=0; i <= count; i++) 
         printf("%x ", en[i]);

     printf("-6f");
}

void decrypt() {
     char msg[3001], ch;
     int i,key, en[3001],d;

     printf("\n");
     key = pin();
     printf("\nEnter encrypted message -\n\n");
     getchar();

     for (i=0; i <= 3001; i++) {
         scanf("%x",&d);

         if (d == -111) {
            msg[i] = '\0';
            break;
         } else {
            ch = d + key;
            msg[i] = ch;
         }
     }

     printf("\nDecrypted message -\n\n");
     puts(msg);
}

1 Ответ

4 голосов
/ 06 августа 2020

Во втором for l oop:

for(i = 0; i <= count; i++)

Вы бежите за конец массива (индексы массива начинаются с нуля, а не с единицы).

Изменить это:

for(i = 0; i < count; i++)

Всегда помещайте объявления переменных каждое в отдельной строке.

int a, b, c = 0;        // only one variable is initialized.
char *src = 0, c = 0;   // c is of type char, not char*

fgets включает завершающую новую строку. Если он вам не нужен, снимите его.

int len = strlen(msg);
if(len > 0 && msg[len - 1] == '\n')
   msg[len - 1] = '\0';
...