【问题标题】:Convert C program to C++ [closed]将 C 程序转换为 C++ [关闭]
【发布时间】:2013-02-06 04:44:58
【问题描述】:

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

#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:
    }
}

【问题讨论】:

  • 公平地说,它已经是有效的 C++,因为所有的 C 都是有效的 C++
  • @DanF Not all C.
  • @DanF: void new(void) {} int main(void) { new(); } !
  • @CSE 你听说过 std::string 吗?
  • @ouch,我需要朝着正确的方向前进。代码可以编译,但没有显示长度,任何有关如何启动解密方法的建议都会有所帮助。

标签: c++ c


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢你,你让我走了:)
  • 发布的代码是无效的 C++,其中 main() 必须声明为返回 int。
  • @Clifford- 是的。从技术上讲,出于同样的原因,我相信它也不是有效的 C。
【解决方案2】:

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

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

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

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

  • 1234563 using namespace std' 指令。
  • 代码使用 C 标准库,它也是 C++ 标准库的一部分,但 C++ 有许多替代方案在许多方面都更胜一筹。例如,&lt;cstdio&gt; 在很大程度上被&lt;iostream&gt; 及其派生词(例如&lt;stringstream&gt;&lt;fstream&gt;)所取代,而字符串处理和实际上的字符串数据类型由&lt;string&gt; 提供。使用&lt;iostream&gt;&lt;string&gt; 来实现这段代码可以大大简化它。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2015-12-29
    • 2015-09-16
    • 2011-05-11
    • 2011-01-15
    • 1970-01-01
    • 2012-11-12
    相关资源
    最近更新 更多