Как проверить есть ли символ в строке c
Перейти к содержимому

Как проверить есть ли символ в строке c

  • автор:

Как проверить, есть ли символ в строке в 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:50

    1 ответ 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) будет правильней писать.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *