按顺序,从问题 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;
}
确保:
- 您包括给定的标题, for
cout
和strchr
.
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.
如有必要,您可以在此处验证。