我正在研究ROT13的c ++实践。但是这里的这段代码返回错误并且无法编译,我不明白为什么!我在以下几行中发布了一段代码
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中的哪门课程可以帮助我开发更有效的算法?是计算理论,离散数学还是算法?
答案 0 :(得分: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;
}
确保:
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.
,如有必要,您可以验证here。
答案 1 :(得分:0)
将alphabet
投射到const char*
,之后应该可以使用。请注意,type[]
与type *
不同。