0

我正在为 C++ 练习使用 ROT13。但是这里的这段代码返回错误并且无法编译,我不明白为什么!我在以下几行中发布了一段代码

string encode(string &x)
{
    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";

    for (size_t l=0;l<x.size();++l){
        cout<<x[l];
        cout<< strchr(alphabet,x[l]);    
    }
    return x;
}

Q2。还帮助我从字母[]返回匹配字母的索引(例如,5代表'f'),我可以添加13并将其附加到x等等..

Q3。除了练习之外,CS 中的哪门课程可以帮助我开发更高效的算法?是计算理论、离散数学还是算法?

4

2 回答 2

2

按顺序,从问题 1 开始:

以下对我来说编译得很好:

#include <iostream>
#include <cstring>

std::string encode(std::string &x)
{
    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    char *ptr;
    for (size_t l=0;l<x.size();++l){
        std::cout<<x[l];
        std::cout<< std::strchr(alphabet,x[l]);
    }
    return x;
}

int main (int argc, char* argv []) {
    return 0;
}

确保:

  • 您包括给定的标题, forcoutstrchr.
  • std::除非您使用命名空间,否则请使用前缀std
  • 解决这个ptr问题。

问题2:

如果您正在寻找一种方便的 ROT-13 方法,请考虑使用两个 C 字符串,一个用于源代码,一个用于翻译:

char from[] = "abcdefghijklmnopqrstuvwxyz";
char to  [] = "nopqrstuvwxyzabcdefghijklm";

然后,您可以使用strchr在第一个中查找它并使用该指针在第二个中查找等效项。

char src = 'j';
char *p = strchr (from, src);
if (p == NULL)
    std::cout << src;
else
    std::cout << to[p - from];

如果找不到字符,那将按原样输出字符,如果找到,则查找翻译。您可能还想在其中输入大写字母。

问题 3:

如果您想学习有效的算法,我会去学习算法课程,令人惊讶的是:-)

计算理论听起来有点枯燥,尽管它很可能涵盖了算法背后的理论基础。离散数学适用于算法,但同样,它可能非常理论化。这一切都基于单词的含义,当然,所涵盖的实际学科领域可能完全不同,因此您可能应该与提供课程的人一起讨论。

额外位:

如果您正在寻找可以与自己的作品进行比较的东西,这是我根据上面的建议整理的:

#include <iostream>
#include <cstring>

std::string rot13 (std::string x)
{
    char from[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char to  [] = "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM";
    std::string retstr = "";
    for (size_t i = 0; i < x.size(); ++i) {
        char *p = std::strchr (from, x[i]);
        if (p == 0)
            retstr += x[i];
        else
            retstr += to[p - from];
    }
    return retstr;
}

int main (int argc, char* argv []) {
    std::string one = "This string contains 47 and 53.";
    std::string two = rot13 (one);
    std::string three = rot13 (two);
    std::cout << one << '\n';
    std::cout << two << '\n';
    std::cout << three << '\n';
    return 0;
}

返回字符串的构建可能可以更有效地完成(例如一个新的字符数组,它只在最后变成一个字符串),但它很好地说明了该方法的“查找”部分。

输出是:

This string contains 47 and 53.
Guvf fgevat pbagnvaf 47 naq 53.
This string contains 47 and 53.

如有必要,您可以在此处验证。

于 2012-02-27T12:59:44.483 回答
0

转换alphabet为 a const char*,之后它应该可以工作。请记住,这type[]type *.

于 2012-02-27T12:56:14.717 回答