-4

帮助!我正试图弄清楚我们教授给我们的这段代码——

#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代码转换为C++.

  • 将代码添加到“解密”方法以破译加密的文本。

  • 更改代码以使用pointer操作而不是array操作来加密和解密消息。

  • 在main方法中,调用“decrypt”方法对密文(str)进行解密。

这是我设法做到的,但我现在几乎被困住了。特别是因为我没有C语言背景。任何帮助,将不胜感激。

#include <iostream>
#include <string.h>

void encrypt(int offset, char *str)
{   
    std::cout << "\nUnencrypted str = \n" << str;

    char *pointer = str;

    while(*pointer)
    {
        if (*pointer !=32)  
            *pointer = *pointer + offset;
        ++pointer;
    }

    std::cout <<"\nEncrypted str =\n" << str << "\n\nlength = ";
}

void decrypt(int offset, char *str) {

    // add your code here
}

void main(void) {

    char str[1024];

    std::cout << "Please enter a line of text max " << sizeof(str) << " characters\n";

    if (fgets(str, sizeof(str), stdin) != NULL)
    {
        encrypt(5, str);    // What is the value of str after calling "encrypt"?

        // add your method call here:
    }
}
4

2 回答 2

3

大多数格式良好的 C 代码都可以编译为 C++,将文件重命名为 .cpp,使用 C++ 编译来编译代码并修复中断的地方。main() 作为返回 void 的声明至少应该中断(它充其量是有问题的 C 代码,并且显式不正确的 C++)。

这完全取决于您的教授对您的期望;“将其转换为 C++”的要求太模糊了。您希望使用 C++ 的哪些功能?虽然作为 C++ 的简单重新编译在技术上使其成为 C++ 代码(即使它也是有效的 C 代码),但我不知何故怀疑这是练习的意图。

关键是,虽然通过重新编译进行表面转换是可能的,但 C++ 提供了以不同方式对其进行编码的机会。例如:

  • 头文件名<stdio.h><string.h>在 C++ 中已弃用,您可以使用<cstdio>and<cstring>代替。这段代码中说的<string.h>是多余的;没有任何代码依赖于它。

  • 如果您使用未弃用的标头,则所有标准库都位于std::名称空间中,因此所有标准库符号都需要通过为其添加前缀std::或(不太有利)使用using namespace std'指令来进行范围解析。

  • 代码使用 C 标准库,它也是 C++ 标准库的一部分,但 C++ 有许多替代方案在许多方面都更胜一筹。<cstdio>例如,在很大程度上被替换为<iostream>及其派生词,例如<stringstream>and<fstream>和字符串处理,实际上字符串数据类型由<string>. 使用<iostream><string>实现此代码可以大大简化它。

  • 如果要使用std::string该类,则可以使用迭代器来遍历字符串内容。

  • C++ 支持 OOP。在这种情况下,您可能会创建一个包含加密和解密方法的类。尽管在这种情况下这样做的论据可能很弱,除了举例说明您对这个概念的理解。

所以你看到“转换”的范围非常广泛,从几乎没有工作到完全重新设计。在设计说明中,我要做的一件事是将加密/解密方法与输出操作分开。如果这些方法不坚持将结果输出到控制台,它们将是可重用的。他们最好将数据返回给调用者,调用者可以用它来做它需要的事情。当然,这也可能超出了本练习的范围,因为这就是将作业呈现给您的方式。

于 2013-02-05T20:39:18.820 回答
3

您发布的代码应该在 C++ 和 C 中工作。应该不需要“转换”任何东西,除非有您没有告诉我们的特定要求。

您的数组到指针的转换看起来是正确的,尽管我认为代码在数组形式中更具可读性。

对于您的decrypt方法,您将需要编写与encrypt方法相反的代码。解决此问题的最佳方法是运行一些示例文本encrypt并检查输出的外观。该函数一次将输入转换为一个字符,因此您应该能够逐字节地将输入映射到输出。使用此信息,您可以检测模式并构造一个函数,使转换在另一个方向。

于 2013-02-05T19:04:35.143 回答