Имеется такой код:
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] = "Б"; и т.д.
Мне кажется, что вот так:
if(alphabet[i].size() == 1 && alphabet[i][0] == symbol) return i;
будет наиболее эффективно.
У вас 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
, но этот вариант может и подойти, если размер данных динамический.]
Подключи <string>
и используй std::to_string
.
Для твоего случая:
std::to_string(symbol)
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Решил я написать частотный анализ текста на c++Возникли следующие проблемы: Русские символы нужны на всех платформах(linux, mac os, windows), поэтому...
Нужно написать плагин для OpenCPN, но поскольку не нашел ни одного пособия, то решил разобраться на примере исходного кода существующихНо после...