strchr不使用char []

时间:2012-02-27 12:54:08

标签: c++ string strchr

我正在研究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中的哪门课程可以帮助我开发更有效的算法?是计算理论,离散数学还是算法?

2 个答案:

答案 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;
}

确保:

  • 您为coutstrchr添加了标题。
  • 除非您使用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 *不同。