将C程序转换为C ++

时间:2013-02-05 18:55:39

标签: c++ c

帮助!我正在试图找出我们教授给我们的代码 -

#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++

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

  • 更改代码以使用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:
    }
}

2 个答案:

答案 0 :(得分:3)

您发布的代码应该使用C ++和C语言。除非有特殊要求,否则不需要“转换”任何内容。

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

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

答案 1 :(得分:3)

最好的C代码可编译为C ++,重命名文件.cpp,使用C ++编译编译代码并修复中断的内容。声明main()作为返回void至少应该中断(它最好是可疑的C代码,并且显然是错误的C ++)。

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

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

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

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

  • 代码使用C标准库,它也是C ++标准库的一部分,但C ++在很多方面都有其他优势。例如,<cstdio>在很大程度上被<iostream>及其衍生物(如<stringstream><fstream>取代,字符串处理,实际上字符串数据类型由{{1}提供}。使用<string><iostream>来实现此代码可以大大简化它。

  • 如果您要使用<string>类,则可以使用迭代器遍历字符串内容。

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

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