RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1105378
Accepted
nichtdeinetraumfrau
nichtdeinetraumfrau
Asked:2020-04-04 19:28:59 +0000 UTC2020-04-04 19:28:59 +0000 UTC 2020-04-04 19:28:59 +0000 UTC

帮助数组溢出

  • 772

我正在编写一个适用于 Vigenere 加密的代码。在输入密钥进行加密时,出现一个问题,相同密钥的数组溢出,我不能继续前进,我已经伤透了脑筋。

输入密钥时,必须将其写入密钥数组,然后在 Encryption_Viz 函数中使用,但会发生溢出。

截图链接:https ://imgur.com/a/1lvG01o

项目: http ://cpp.sh/9zern

或者像这样:


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


#define STR_LEN 100

char alphavite[] =  "abcdefghijklmnopqrstvuwxyz";

void Input_By_File(char *started_string)
{
    FILE* pFile;
    char mystring[100];

    pFile = fopen("text.txt", "r");
    if (pFile == NULL) perror("\nError opening file");
    else {
        if (fgets(mystring, 100, pFile) != NULL) 
        {
            for (int i = 0; i < STR_LEN; i++) 
            {
                started_string[i] = mystring[i];
            }
            puts(started_string);
        }
        fclose(pFile);
    }
}

void Input_By_Yourself(char* started_string)
{
    getchar();

    gets_s(started_string, STR_LEN);
    printf(">Вы ввели строку:      '%s'\n\n", started_string);
}

void Output_Start_Info()
{

    printf("                Добро пожаловать в программу для шифровки/расшифровки текста!\n\nВ нашей программе представлен следующий виды шифрования:");
    printf("\n\n");
    printf(">Шифр Вижинера\n");
}

void Input_Start_String(char* started_string)
{
    int key;

    printf("\n\nВыбирете метод ввода данных: \n1 — Ввести вручную\n2 — Загрузить из файла\n");
    scanf_s("%i", &key);
    switch (key)
    {
    case 1: printf("\n\nПожалуйста введите текст, который хотите де-/за-шифровать, на английском языке: "); Input_By_Yourself(started_string);
        break;
    case 2: printf("\n\nПроисходит загрузка файла (text.txt) с текстом, который хотите де-/за-шифровать.\n"); printf("Ваш файл содержит следующую строку: ");  Input_By_File(started_string);
        break;
    default: printf("Вы ввели неправильный ключ, попробуйте сначала.");
        break;
    }

}

int Input_Type_of_Encryption() 
{
    int key = 0;
    printf("\n\nПожалуйста, введите номер вида шифрования, который вы хотите использовать для данной строки: ");
    scanf_s("%i", &key);

    return key;
}

int Type_Of_Work()
{
    int key;
    printf("\n\nПожалуйста, выберите тип выполняемой работы:\n1 — Зашифровать текст\n2 — Расшифровать текст\n");
    scanf_s("%i", &key);

    return key;

}

/*char Key_For_Encryption()
{
    char key[STR_LEN + 1] = "";
    printf("\n\nВведите ключ для шифрования: ");

    Input_By_Yourself(key);

    return key[STR_LEN];
}*/


void Encryption_Viz(char *started_string, char *encrypte_string)
{
    char key[STR_LEN] = "";
    printf("\n\nВведите ключ для шифрования: ");

    Input_By_Yourself(key);




    char long_string[] = " ";

    int s = strlen(started_string);
    int e = strlen(key);



    if (s >= e)
    {
        for(int i = 0; i < s; i++)
        {
            long_string[i] = key[((e+1)%(i+1))];
        }
    }

    else
    {
        for (int i = 0; i < s; i++)
        {
            long_string[i] += key[i];
        }
    }

    printf("%s ", long_string);

}

int Decryption(char* text, int k, char* key, int a, int j) 
// text - шифр-текст, key- ключ, k - длина блока text, a - длина ключа, j - каков будет размер блока расшифрованного сообщения 

{
    int i;
    for (i = 0; i < k; i++)
    {
        if (j == a - 1)
            j = 0;
        if (text[i] != 32)
        {
            if (text[i] >= 'A' && text[i] <= 'Z')
            {
                if (key[j] >= 'A' && key[j] <= 'Z')
                {
                    text[i] = ((text[i] - key[j] + 26) % 26) + 65;
                    j++;
                }
                else if (key[j] >= 'a' && key[j] <= 'z')
                {
                    text[i] = text[i] + 32;
                    text[i] = ((text[i] - key[j] + 26) % 26) + 65;
                    j++;
                }
            }
            else if (text[i] >= 'a' && text[i] <= 'z')
            {
                if (key[j] >= 'a' && key[j] <= 'z')
                {
                    text[i] = ((text[i] - key[j] + 26) % 26) + 97;
                    j++;
                }
                else if (key[j] >= 'A' && key[j] <= 'Z')
                {
                    text[i] = text[i] - 32;
                    text[i] = ((text[i] - key[j] + 26) % 26) + 97;
                    j++;
                }
            }
        }
    }
    return j;
}

int main()
{
    char started_string[STR_LEN + 1] = "";
    char encrypted_string[STR_LEN + 1] = "";

    setlocale(LC_ALL, "Russian");
    Output_Start_Info();
    switch (Type_Of_Work())
    {
        case 1: 
                Input_Start_String(started_string);
                Encryption_Viz(started_string, encrypted_string);
                break;

        case 2: 
                Input_Start_String(started_string); 
                Decryption();
                break;

        default: printf("Проверьте правильность введного ключа.");
                break;
    }


    return 0;
}

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Dmitry Safonov
    2020-04-04T23:27:10Z2020-04-04T23:27:10Z

    我快速浏览了该程序,以下是一些评论:

    1) 在Input_Start_String函数中有scanf_s("%i", &key)。此函数从标准输入缓冲区读取一个数字,但在缓冲区中留下未读取的“\n”(回车)字符。因此,在Input_By_Yourself函数中读取文本时显示提示“请输入您要解密/加密的文本...”后,读取的第一个字符将是缓冲区中剩余的“\n”。但是当再次调用 Input_By_Yourself 函数读取加密密钥时,“\n”字符将不再在缓冲区中,所以getchar()命令愚蠢地认为密钥的第一个字符,结果是密钥字符串被认为没有第一个字符。解决方案:并在 Input_Start_String 函数中的scanf_s ("%i", &key)之后编写getchar()函数调用:

    /* In function Input_Start_String() */
    scanf_s("%i", &key);
    getchar();
    switch (key)
    {
        ...
    }
    

    2) 在Encryption_Viz函数中,您静态创建一个仅包含 2 个字符的字符串(这是一个探针,然后是行终止符 '\0')。但同时你把字符串 s 中的所有字符都写在那里!!!由于在编译时无法知道 long_string 的大小(因为它取决于要加密的字符串的长度),所以防止溢出的唯一方法是为 long_string 动态分配内存!!!

    void Encryption_Viz(char *started_string, char *encrypte_string)
    {
        char key[STR_LEN] = " ";
        printf("\n\nВведите ключ для шифрования: ");
        Input_By_Yourself(key);
        int s = strlen(started_string);
        int e = strlen(key);
    
        char *long_string = (char *)malloc((s + 1) * sizeof(char));
    
        if (s >= e)
        {
            for (int i = 0; i < s; i++)
            {
                long_string[i] = key[((e + 1) % (i + 1))];
            }
        }
        else
        {
            for (int i = 0; i < s; i++)
            {
                long_string[i] += key[i];
            }
        }
        long_string[s + 1] = '\0';
        printf("%s ", long_string);
        free(long_string)
    }
    

    注意分配(malloc)和清除(free)动态内存的功能。

    • 2

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5