将简单的 C 加密转换为 C++

Posted

技术标签:

【中文标题】将简单的 C 加密转换为 C++【英文标题】:Converting simple C encryption to C++ 【发布时间】:2012-09-23 23:23:29 【问题描述】:

我有一些令人尴尬的基本问题,我似乎无法找到我能够处理的答案。上次我向你们寻求帮助时,我的运气非常好,所以我希望能重蹈覆辙。我之前没有任何类型的 C/C++ 方面的经验,而且这门课假设至少有 1 个学期,所以它踢了我一点。

这是教授给我的代码:

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

void encrypt(int offset, char *str) 

int i,l;

l=strlen(str);

printf("\nUnencrypted str = \n%s\n", str);

for(i=0;i<l;i++)
    if (str[i]!=32)  
        str[i] = str[i]+ offset;

printf("\nEncrypted str = \n%s \nlength = %d\n", str, l);


void decrypt(int offset, char *str) 

// add your code here


void main(void) 

char str[1024];

printf ("Please enter a line of text, max %d characters\n", sizeof(str));

if (fgets(str, sizeof(str), stdin) != NULL)

    encrypt(5, str);    // What is the value of str after calling "encrypt"?

    // add your method call here:


这是我应该执行的操作:

将代码转换为 C++。替换所有 printf、scanf 和 fgets 语句。 在“解密”方法中添加代码以解密加密文本。 更改代码以使用指针操作而不是数组操作来加密和解密消息。 在main方法中,调用“decrypt”方法对密文(str)进行解密。

我不是直接要求作业的答案,但我需要帮助了解我正在犯的错误以及我需要做什么。

这是我在作业的第一部分的尝试:

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

void encrypt(int offset, char *str) 

int i,l;

l=strlen(str);

cout << "\nUnencrypted str = \n%s\n", str;

for(i=0;i<l;i++)
    if (str[i]!=32)
        str[i] = str[i]+ offset;

cout << "\nEncrypted str = \n%s \nlength = %d\n", str, l;


void decrypt(int offset, char *str) 

// add your code here


int main(void) 

char str[1024];

cout << "Please enter a line of text, max %d characters\n", sizeof(str);

if (fgets(str, sizeof(str), stdin) != NULL)

    encrypt(5, str);    // What is the value of str after calling "encrypt"?

    // add your method call here:


问题是这就是我要解决的问题,我无法弄清楚需要做些什么不同的事情。

请输入一行文字,最多 %d 个字符 地狱世界

未加密的 str = %s

加密的 str = %s 长度 = %d

在这一点上我什么都不想,我已经花了几个小时在谷歌上搜索并尝试了一些东西,但没有真正到达任何地方,我知道这应该不会超过一个小时。

【问题讨论】:

我很难理解你的问题到底是什么。你能解释一下你得到的哪一部分与应该的不同吗? 如果您对算法的工作方式有疑问,请在纸上写下几个例子,您会发现解密结果正好相反 @1" - 他要你做他的作业。 @Matt 我从来没有要求过答案,并明确表示那不是我所追求的。我需要了解我现在是否要在这门课上走得很远。但是@1" 当我使用 cout 替换我的 printf 语句时,我在打印语句中得到的所有内容都是 %s%d,而不是我的加密或解密字符串。此外,当我用 cin.getline 替换 frets 语句时,它说 getline找不到函数? 我相信一切都正常工作并占了上风,除了我的长度不能正确。他们要么只返回 160 或 8 左右的大数字,我猜这只是位。 【参考方案1】:

std::iostream 不接受 printf 样式格式。相反,只需断开字符串并使用参数链接另一个&lt;&lt;,例如

int myInt = 5;
std::cout << "HelloWorld" << myInt << '\n';

这适用于所有基本类型,但对于自定义类,您需要手动添加 ostream &lt;&lt; 运算符。

【讨论】:

感谢帮助,尤其是当我意识到我必须停止使用 %d 而是使用我的 str 时。【参考方案2】:

查看“更改代码以使用指针操作而不是数组操作来加密和解密消息”,让我们看看我是否可以解释这一点。 (我将专注于指针部分)。我将重写 encrypt 函数几次,希望能说清楚

首先,我们将for 转换为while 循环

void encrypt(int offset, char *str) 

    int i,l;

    l=strlen(str);

    printf("\nUnencrypted str = \n%s\n", str);

    i = 0;
    while(i < l)
    
        if (str[i]!=32)  
            str[i] = str[i]+ offset;
        ++i;
    

    printf("\nEncrypted str = \n%s \nlength = %d\n", str, l);

现在,我们尝试摆脱strlen 调用。 strlen 计算 C 字符串开头和空字符的第一个出现之间的所有字符。空字符可以写为'\0',但在C 或C++ 中,这与只写0 几乎相同。类似于比较str[i] != 32,如果我们想循环,只要字符串str的位置i处的字符不为0,我们就可以写str[i] != 0

void encrypt(int offset, char *str) 

    int i;

    printf("\nUnencrypted str = \n%s\n", str);

    i = 0;
    while(str[i] != 0)
    
        if (str[i]!=32)  
            str[i] = str[i]+ offset;
        ++i;
    

    printf("\nEncrypted str = \n%s \nlength = %d\n", str, l);

str[i] 等价于下面的*(str + i),只是写法不同而已。 所以我们可以重新重写

void encrypt(int offset, char *str) 

    int i;

    printf("\nUnencrypted str = \n%s\n", str);

    i = 0;
    while(*(str + i) != 0)
    
        if (*(str + i)!=32)  
            *(str + i) = *(str + i) + offset;
        ++i;
    

    printf("\nEncrypted str = \n%s \nlength = %d\n", str, l);

现在我们已经有了只使用指针的解决方案,但我们可以通过更好地理解指针来使其更漂亮。

让我们用另一个变量再次重写

void encrypt(int offset, char *str) 

    int i;

    printf("\nUnencrypted str = \n%s\n", str);

    i = 0;
    char *ptr = (str + i);
    while(*ptr != 0)
    
        if (*ptr!=32)  
            *ptr = *ptr + offset;
        ++i;
        ptr = (str + i);
    

    printf("\nEncrypted str = \n%s \nlength = %d\n", str, l);

所以我在这里所做的只是用新变量 ptr 替换 (s + i)。 在最后一步中,我们删除了 i,因为它只是一个辅助变量,它告诉我们必须从起始地址跳转多少个地方。但由于它每次迭代只增加一,我们直接移动指针。

void encrypt(int offset, char *str) 

    printf("\nUnencrypted str = \n%s\n", str);

    char *ptr = str;
    while(*ptr) // the same as *ptr != 0
    
        if (*ptr!=32)  
            *ptr = *ptr + offset;
        ++ptr;
    

    printf("\nEncrypted str = \n%s \nlength = %d\n", str, l);

然后按照 Seth Carnegie 的建议将您的 printf 呼叫替换为 std::cout 呼叫。

对于解密:只需尝试查看 encrypt: when encrypt 'sees' a chracter that is not equal to 32, it addsoffset` 中发生的情况给该字符并将其分配回去。所以试着想想你必须做什么,来恢复这个操作(这与 C 完全无关)

【讨论】:

非常感谢您,我真的不是故意让您为我做实际的问题,因为通常不会完全理解它,但是您带我完成了整个思考过程,我真的很感激。我仍在努力让我的 cout 调用正常工作,尽管我确信这只是导致我对它们的功能以及 %d%s 的工作原理了解有限

以上是关于将简单的 C 加密转换为 C++的主要内容,如果未能解决你的问题,请参考以下文章

将 Fortran 转换为 C 或 C++

如何将 16 位值的数组转换为 base64?

将字符串转换为双精度的 C++ 错误

简单的 C++ - 关于字符串和连接以及将 int 转换为字符串 [重复]

WDK:将 PVOID 转换为 PWCHAR(C 到 C++ 转换)

c ++奇怪的问题将char转换为int