strchr не работает с char [] - PullRequest
       27

strchr не работает с char []

0 голосов
/ 27 февраля 2012

Я работаю над 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 ]

2 голосов
/ 27 февраля 2012

По порядку, начиная с вопрос 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.

, который вы можете проверить здесь , если необходимо.

0 голосов
/ 27 февраля 2012

Приведение alphabet к const char*, потом должно работать. Имейте в виду, что type[] отличается от type *.

...