将简单的 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
样式格式。相反,只需断开字符串并使用参数链接另一个<<
,例如
int myInt = 5;
std::cout << "HelloWorld" << myInt << '\n';
这适用于所有基本类型,但对于自定义类,您需要手动添加 ostream <<
运算符。
【讨论】:
感谢帮助,尤其是当我意识到我必须停止使用%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 adds
offset` 中发生的情况给该字符并将其分配回去。所以试着想想你必须做什么,来恢复这个操作(这与 C 完全无关)
【讨论】:
非常感谢您,我真的不是故意让您为我做实际的问题,因为通常不会完全理解它,但是您带我完成了整个思考过程,我真的很感激。我仍在努力让我的 cout 调用正常工作,尽管我确信这只是导致我对它们的功能以及%d
和 %s
的工作原理了解有限以上是关于将简单的 C 加密转换为 C++的主要内容,如果未能解决你的问题,请参考以下文章
简单的 C++ - 关于字符串和连接以及将 int 转换为字符串 [重复]