Как сравнить char и string c++?

444
14 февраля 2017, 19:25

Имеется такой код:

int analysis::_indexOfSymbol(char symbol, std::string* alphabet, int size) {
for (int i = 0; i < size; ++i) {
    if(symbol == alphabet[i]) return i;
}
return NULL;
}

Компилятор выдает ошибку, что невозможно сравнить int и строку. Хотя, symbol является типом char(да, это буквенный эквивалент кода, но тем не менее). Я пытался преобразовать symbol к string, но ни (std::string) symbol, ни std::string(symbol), ни std::string k = std::symbol(symbol) мне не помогли. Точно также, я пытался преобразовать alphabet[i] в char(ВНИМАНИЕ! В массиве array хранятся строковые значения, но односимвольные), но у меня ничего не вышло из-за различия типов char* и char.

Код, который создает alphabet выглядит примерно так:

this->alphabet[0] = "А"; this->alphabet[1] = "Б"; и т.д.
Answer 1

Мне кажется, что вот так:

if(alphabet[i].size() == 1 && alphabet[i][0] == symbol) return i;

будет наиболее эффективно.

Answer 2

У вас alphabet — не строка, а указатель на строку. Ну и sizeof(alphabet) выдаёт размер указателя (то есть, 4 или 8, в зависимости от вашей платформы), а не размер строки.

Кроме того, размер std::string считается не так. Сама строка выделяется где-то в куче, а sizeof выдаёт размер лишь самого объекта, то есть, содержащихся в нём указателей.

Правильный цикл такой:

for (int i = 0; i < alphabet->size(); ++i) {
    if (symbol == (*alphabet)[i]) return i;
}

Кроме того, финальный return NULL, судя по всему, неправильный, ведь NULL — это просто 0, и значит, возвращаемое значения будет выглядеть как будто бы символ нашёлся на нулевой позиции.

Впрочем, вы можете просто не строить велосипед, а воспользоваться встроенной функцией поиска: alphabet->find(symbol). Если символ не найден, она вернёт константу std::string::npos.

Если указатель на самом деле соответствует массиву строк, то вы должны передавать его размер отдельным параметром:

int analysis::_indexOfSymbol(char symbol, std::string* alphabet, size_t array_size) {
    for (int i = 0; i < array_size; ++i) {
        // здесь можно искать вхождение символа:
        auto pos = alphabet[i].find(symbol);
        if (pos != std::string::npos)
            return i;
    }
    return -1; // или какое-то другое значение, не могущее быть индексом
}

Достать размер массива из указателя нельзя.

Альтернативный путь — использовать вместо массива (ссылку на) std::vector, вот он-то как раз знает размер своих данных.

[Или можно сделать метод шаблонным, и принимать std::array, но этот вариант может и подойти, если размер данных динамический.]

Answer 3

Подключи <string> и используй std::to_string. Для твоего случая: std::to_string(symbol).

READ ALSO
Частотный анализ текста c++

Частотный анализ текста c++

Решил я написать частотный анализ текста на c++Возникли следующие проблемы: Русские символы нужны на всех платформах(linux, mac os, windows), поэтому...

292
Не работают плагины для OpenCPN [требует правки]

Не работают плагины для OpenCPN [требует правки]

Нужно написать плагин для OpenCPN, но поскольку не нашел ни одного пособия, то решил разобраться на примере исходного кода существующихНо после...

286
Почему CListView обнуляется?

Почему CListView обнуляется?

У меня есть объект

297