C++ 将简单C加密转换为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
#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;istd::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了解有限