将C程序转换为C++

Convert C program to C++

本文关键字:C++ 程序转换      更新时间:2023-10-16

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

#include <stdio.h>
#include <string.h>
void encrypt(int offset, char *str) {
    int i,l;
    l=strlen(str);
    printf("nUnencrypted str = n%sn", str);
    for(i=0;i<l;i++)
        if (str[i]!=32)  
            str[i] = str[i]+ offset;
    printf("nEncrypted str = n%s nlength = %dn", 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 charactersn", 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 << "nnlength = ";
}
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) << " charactersn";
    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中工作。不需要"转换"任何东西,除非有您没有告诉我们的特定需求。

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

对于decrypt方法,您需要编写与encrypt方法相反的代码。最好的方法是通过encrypt运行一些示例文本,并检查输出的样子。该函数一次将输入转换为一个字符,因此您应该能够逐字节地将输入映射到输出。有了这些信息,您可以检测模式并构造一个函数,使转换朝另一个方向进行。

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

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

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

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

  • 如果使用不推荐使用的标头,则所有标准库都在std::命名空间中,因此所有标准库符号都需要通过前缀std::或(不太好)使用using namespace std'指令来进行范围解析。

  • 该代码使用C标准库,它也是C++标准库的一部分,但C++有许多方面更优越的替代方案。例如,<cstdio>在很大程度上被<iostream>及其衍生物(如<stringstream><fstream>)所取代,并且字符串处理和事实上的字符串数据类型由<string>提供。使用<iostream><string>来实现该代码可以极大地简化

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

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

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