Как проверить, есть ли символ в строке в C++?
Хорошо, я думаю, что это должно быть чрезвычайно просто, но для моей жизни я не могу разобраться. Я пытаюсь написать функцию для нахождения символа в строке для программы-вешалки. Так что я придумал:
int drawHangman(char trY, string wordA) < int wrongTries = 0, if(wordA.find(trY) != string::npos) //checking to see if char is in word wrongTries++; //if its not, ++ else wrongTries = wrongTries; //if it is, do wrong tries remains the same return wrongTries; //return # wrong tries >
Поделиться Источник 02 мая 2014 в 16:43
3 ответа
Вы уже нашли способ проверить, находится ли символ внутри заданной строки (функция find ). Просто оставьте это простым:
bool isInside(const std::string & str, char c)
Попробуйте разделить каждую задачу на функцию, которая выполняет одну простую вещь. Функция, которая определяет, находится ли символ в заданной строке, не должна делать ничего больше. Подсчет количества раз, когда эта функция возвращает false , является вопросом другой функции, так как это не связанная с поиском задача (не связанная с поиском, то есть).
Ваша функция drawHangman должна просто сосредоточиться на фактическом отрисовке повешения, заданного через параметр, например, сколько раз пользователь не смог выполнить ошибку.
Поделиться 02 мая 2014 в 16:56
Если я правильно понял ваш вариант, то вам нужно следующее
size_t drawHangman( const std::string &word, char c ) < static size_t wrongTries = 0; if ( word.find( c ) != std::string::npos ) < return ( wrongTries = 0 ); >else < return ( ++wrongTries ); >>
Если вам нужно сбросить wrongTries, вы можете вызвать i с некоторыми произвольными значениями, например
drawHangman( " ", ' ' );
Если вы не хотите вызывать функции, как я показал выше, чтобы сбросить wrongTries, то вы можете определить это следующим образом
size_t drawHangman( const std::string &word = " ", char c = ' ' ) < static size_t wrongTries = 0; if ( word.find( c ) != std::string::npos ) < return ( wrongTries = 0 ); >else < return ( ++wrongTries ); >>
и вы можете просто вызвать это как
drawHangman();
чтобы сбросить wrongTries.
Если вам нужен поиск без учета регистра, то вы можете использовать стандартный алгоритм std::find_if . Например
#include size_t drawHangman( const std::string &word, char c ) < static size_t wrongTries = 0; suto it = std::find_if( word.begin(), word.end(), [=]( char t ) < return ( std::toupper( t ) == std::toupper( c ) ); >); if ( it != word.end() ) < return ( wrongTries = 0 ); >else < return ( ++wrongTries ); >>
С другой стороны, если вам нужно посчитать все случаи, когда символ не присутствует в строке, вы можете написать функцию следующим образом
int drawHangman( const std::string &word = "", char c = '\0' ) < static int wrongTries = 0; if ( word.empty() ) < wrongTries = 0; return wrongTries; >if ( word.find( c ) != std::string::npos ) < return ( -wrongTries ); >else < return ( ++wrongTries ); >>
Таким образом, вы можете проверить, присутствует ли символ в строке следующим образом
if ( drawHangman( SomeString, SomeChar ) else < // the character is not found in the string >
А если вам нужно сбросить wrongTries, вы можете вызвать функцию как
drawHangman();
Поделиться 02 мая 2014 в 16:56
Это будет чувствительным к регистру, поэтому если словоA = «пробел» (и я буду предполагать, что слово уже является строчным) и вы ищете ‘C’, вы не найдете ‘C’, но если вы ищете ‘c’, вы найдете ‘c’.
Вы можете использовать std::tolower, чтобы убедиться, что символ trY является строчным, опять же предполагая, что словоA уже является строчным .*
bool IsValidLetter(char trY, const std::string& wordA) < if (wordA.find(std::tolower(trY)) != std::string::npos) < return true; >return false; >
Обратите внимание, что я удалил счетчик wrongTries в этой ситуации, потому что вы просто тестируете (на данном этапе), существует ли буква в слове.
Затем вы хотите сохранить контейнер, вероятно вектор, всех букв, которые были опробованы до сих пор, и это может быть полезным псевдокодом.
int CountWrongLetters(attemptedLetters, wordA) < int wrong = 0; foreach letter in attemptedLetters < if (IsValidLetter(letter, wordA) == false) < wrong++; >> return wrong; >
Где-то еще будет обрабатываться логика для отрисовки каждой части дисплея hangman на основе возвращаемого числа, а также логика для завершения игры.
Как проверить есть ли символ в строке c
Стандартная библиотека С++ также предоставляет ряд встроенных функций для работы с символами. В основном они связанны с проверкой символов:
- isupper(c) : проверяет, является ли c заглавной буквой, по умолчанию от «A» до «Z»
- islower(c) : проверяет, является ли c буквой нижнего регистра, по умолчанию от ‘a’ до ‘z’
- isalpha(c) : проверяет, является ли c алфавитным символом
- isdigit(c) : проверяет, является ли c цифрой от ‘0’ до ‘9’
- isxdigit(c) : проверяет, является ли c шестнадцатеричной цифрой, от ‘0’ до ‘9’, от ‘a’ до ‘f’ или от ‘A’ до ‘F’
- isalnum(c) : проверяет, является ли c алфавитно-цифровым символом; аналогично isisalpha(c) || isdigit(c)
- isspace(c) : проверяет, является ли c пробелом (‘ ‘), символом перевода строки (‘\n’), возвратом каретки (‘\r’), перевод страницы (‘\f’), горизонтальная (‘\t’) или вертикальная (‘\v’) табуляция
- isblank(c) : проверяет, является ли c пробелом (‘ ‘) или символом табуляция (‘\t’)
- ispunct(c) : проверяет, является ли c символом пунктуации (один из следующих: _ < >[ ] # ( ) < >% : ; ? * + — / ^ & | ~ ! » brush:cpp;»> #include int main() < unsigned char letter ; if (std::isupper(letter)) std::cout
Данные функции очень часто применяются при обработке строк. Рассмотрим прстейшую задачу — нам надо извлечь из некоторого текста (например, из строки «Phone number: +1(234)456-78-90» ) номер телефона:
#include #include int main() < std::string text ; std::string phone; // строка для хранения номера for(unsigned i<>; i < text.length(); i++) < // проверяем, является ли символ цифрой if(std::isdigit(text[i])) < // добавляем в строку номера телефона phone += text[i]; >> std::cout
Здесь проходим по всем символам текста и, если символ представляет цифру, то заносим его в строку phone. Другая задача — нам надо сравнить две строки вне зависимости от регистра. С одной стороны, мы могли бы использовать простую операцию сравнения ==, которая также может сравнивать строки. Но если мы попытаемся сравнить две строки, в которых хотя бы один символ отличается по регистру, то они будут не равны:
#include #include int main() < std::string word1 ; word1 = "hello"; std::string word2 ; if(word1 == word2) < std::cout else < std::cout >
Результат данной программы:
strings are not equal
Чтобы организовать сравнение без учета регистра, мы могли бы переводить символы в верхний или нижний регистр и сравнивать их:
#include #include int main() < std::string word1 ; std::string word2 ; bool is_equal; // равны ли строки if(word1.length() != word2.length()) < is_equal = false; >else < // сравниваем все символы for(unsigned i<>; i < word1.length(); i++) < // переводим символы в нижний регистр и сравниваем if(std::tolower(word1[i]) != std::tolower(word2[i])) < // если символы не равны, сбрасываем флаг равенства is_equal = false; break; // выходим из цикла >> > if(is_equal) < std::cout else < std::cout >
В данном случае сначала сравниваем длину строк, так как если длины не равны, то сами строки тоже не равны. Далее в цикле проходим по всем символам обоих строк, переводим их в нижний регистр и сравниваем. Если хотя бы одна пара соответствующих символов не равна, то сбрасываем флаг равенства is_equal в false и выходим из цикла, поскольку строки в этом случае будут уже не равны, и дальше нет смысла сравнивать символы. Результат данной программы:
HELLO and hello are equal
Как проверить значение какого-то символа в String? C#
Предположим есть переменная типа String «12 строка 234 что-то еще». Как можно проверить есть ли в этой переменной символ «ч»?
Отслеживать
задан 25 мар 2019 в 9:31
I dont know I dont know
13 2 2 бронзовых знака
попробуйте ValStr.Contain(«ч»);
25 мар 2019 в 9:34
@Monomax ValStr.Contains(‘ч’);
25 мар 2019 в 9:44
Спасибо, помогло.
25 мар 2019 в 10:00
@tym32167 согласен, опечатка вышла, не допечатал «s».
25 мар 2019 в 10:39
@Monomax ну и я перегрузку для символа вызвал, а не для строки
25 мар 2019 в 10:501 ответ 1
Сортировка: Сброс на вариант по умолчанию
Решено. Спасибо за ответ. Чтобы проверить наличие символа или символов в перeменой типа String: имя переменной . Contains(«то что надо найти»); Чтобы проверить добавляете это все в if
str.Contains("hello");
Отслеживать
71.7k 5 5 золотых знаков 20 20 серебряных знаков 52 52 бронзовых знака
ответ дан 25 мар 2019 в 10:09
I dont know I dont know
13 2 2 бронзовых знакаВ языках программирование «реализованные константы» принято называть «литералы». Ознакомьтесь с разделом «строковые литералы» в с#.
25 мар 2019 в 10:17
Ну, и на заметку: метод Contains реализован просто как return ( IndexOf(value, StringComparison.Ordinal) >=0 ) — см. referencesource. Т.е. со всякими умлаутами и диакритическими знаками может быть нюанс.
Как проверить, существует ли какой-нибудь определённый символ в строке?
Пожалуйста добавьте этот код в вопрос, нажав на кнопку «Править» под вопросом. А так же напишите что не так с вашим кодом.
20 мар 2021 в 16:47
Хорошо, код у вас есть. Объясните, что с ним не так. Он не работает?
20 мар 2021 в 16:48Может и есть другие способы, но это самый лучший (по крайней мере лично я лучше не знаю) способ. Но вы пишите if((stroka.find(‘@’)) < 20) это условие будет возвращать true когда индекс первого вхождения '@' будет < 20. Функция find() возвращает string::npos если символ в строке не найден, иначе возвращает индекс первого вхождения переданного в него символа. if(stroka.find('@') != string::npos) будет правильней писать.