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

C++ 将简单C加密转换为C++;,c++,c,C++,C,我有一些令人尴尬的基本问题,我似乎找不到答案,我可以处理。上次我向你们寻求帮助时,我真是运气太好了,所以我希望能重蹈覆辙。我以前没有任何C/C++方面的经验,这门课假设至少有一个学期,所以这对我来说有点不舒服 这是我的教授给我的代码: #include <stdio.h> #include <string.h> void encrypt(int offset, char *str) { int i,l; l=strlen(str); printf("\nUnenc

我有一些令人尴尬的基本问题,我似乎找不到答案,我可以处理。上次我向你们寻求帮助时,我真是运气太好了,所以我希望能重蹈覆辙。我以前没有任何C/C++方面的经验,这门课假设至少有一个学期,所以这对我来说有点不舒服

这是我的教授给我的代码:

#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:
}
}
#包括
#包括
void encrypt(整数偏移量,字符*str){
int i,l;
l=strlen(str);
printf(“\n未加密的str=\n%s\n”,str);

对于(i=0;i
std::iostream
不接受
printf
样式格式。相反,只需断开字符串并链接另一个
std::iostream
不接受
printf
样式格式。相反,只需断开字符串并链接另一个
查看“将代码更改为使用指针操作而不是数组操作来加密和解密消息”,让我们看看我是否可以解释这一点。(我将重点介绍指针部分)。我将重写加密函数几次,希望能让它更清楚

首先,我们将
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);
}
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
中发生的情况:当encrypt“看到”一个不等于32的字符时,它会将
offset`添加到该字符并将其重新分配。因此,请尝试思考您必须做什么,以恢复此操作(与C完全无关)

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

首先,我们将
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);
}
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
中发生的情况:当encrypt“看到”一个不等于32的字符时,它会将
offset`添加到该字符并将其分配回。因此,请尝试思考您必须做什么,以恢复此操作(与C完全无关)

我发现很难理解你的问题到底是什么。你能解释一下你得到的与它应该是什么不同的部分吗?如果你对算法的工作原理有问题,在一张纸上写下几个例子,你会发现破译只是一个例子opposite@1"-他让你做作业。@Matt我从来没有问过你答案,我明确地说那不是我想要的。我需要理解我现在是否要在这门课上走得很远。但是@1"当我用cout替换printf语句时,我在打印语句中得到的是
%s
%d
,而不是加密或解密的字符串。此外,当我用
cin.getline
替换frets语句时,它说找不到getline函数?我相信除了我不能让我的长度正确。它们要么返回160左右的大数字,要么返回8,我猜这只是位。我发现很难理解你的问题到底是什么。你能解释一下你得到的与它应该是什么不同的部分吗?如果你对算法的工作原理有问题,写几个例子在一张纸上,你会发现解密程序只是一个opposite@1“-他让你做作业。@马特,我从来没有问过你答案,我明确地说那不是我想要的。我需要了解我现在是否能在这门课上走得更远。但是@1”当我用cout替换printf语句时,我在打印语句中得到的是
%s
%d
,而不是加密或解密的字符串。此外,当我用
cin.getline
替换frets语句时,它说找不到getline函数?我相信除了我不能让我的长度正确。它们要么返回160左右的大数字,要么返回8,我猜这只是位。非常感谢你,我真的不想让你为我做实际的问题,因为通常你不会完全理解它,但你让我经历了整个思考过程,我真的很感激。我仍在努力获得我的答案调用工作正常,尽管我确信这只是因为我对它们如何工作以及如何
%d
%s了解有限