0

我有一些令人尴尬的基本问题,我似乎无法找到我能够处理的答案。上次我向你们寻求帮助时,我的运气非常好,所以我希望能重蹈覆辙。我没有任何类型的 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 个字符 hello world

未加密的 str = %s

加密 str = %s 长度 = %d

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

4

2 回答 2

3

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

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

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

于 2012-09-23T23:26:56.537 回答
1

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

首先,我们将 转换forwhile循环

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'but 在 C 或 C++ 中,这与只写0. 与比较类似,只要字符串位置的字符不为0 str[i] != 32,我们就可以编写如果我们想循环。str[i] != 0istr

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);
}

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

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

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

于 2012-09-24T00:26:18.747 回答