Я написал эту программу Ceaser Cipher в C, но каждый раз, когда я запускаю ее, она падает - PullRequest
0 голосов
/ 07 сентября 2018

Я написал эту программу cesar cipher на языке c, она работает нормально, пока я не предоставлю целочисленное значение для ключа, но после этого она вылетает. Можно ли исправить этот код?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char alphabets[] = "abcdefghijklmnopqrstuvwxyz";
int arrow,key;
int search(char x)
{
    for(arrow=0;arrow<strlen(alphabets);arrow++)
    {

        if(x==alphabets[arrow])
        {
        return arrow;
        }
    }
}
char cipherGenerator(int arrow)
{
    arrow=arrow+key;
    if(arrow>strlen(alphabets))
    {
        arrow = (arrow%strlen(alphabets))-1;
    }
    return alphabets[arrow];
}

int main()
{
    char plain_text[]="",cipher_text[]="";
    int i;
    printf("Enter the plain text\n");
    gets(plain_text);
    printf("Enter the key\n");
    scanf("%d",&key);
    for(i=0;i<strlen(plain_text);i++)
    {
      strcat(cipher_text,cipherGenerator(search(plain_text[i])));
    }
    printf("The cipher text is %s:-",cipher_text);
    return 0;
}

1 Ответ

0 голосов
/ 08 сентября 2018

Сбой можно объяснить попыткой записи в массивы длиной 1.

char plain_text[]="",cipher_text[]=""; //these arrays have length 1

gets(plain_text); //will fail and crash here
strcat(cipher_text,cipherGenerator(search(plain_text[i]))); //will crash here

Относительно использования получает :

Функция gets () не выполняет проверку границ, поэтому эта функция чрезвычайно уязвима для атак переполнения буфера. Его нельзя безопасно использовать (если только программа не работает в среде, которая ограничивает то, что может появиться в stdin). По этой причине эта функция устарела в третьем исправлении к стандарту C99 и вообще удалена в стандарте C11. fgets () и gets_s () - рекомендуемые замены.

Никогда не используйте get ().

...