Имеется такой код:
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).
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости