Проверка наличия символа в строке C++
Задача такова: необходимо ввести символ и проверить к какому алфавиту и регистру он принадлежит. С латинскими буквами все нормально,но проблемы возникают с кириллицей. Подскажите что не так в моей программе. Код данной задачи:
setlocale(LC_ALL,"Russian"); char i; cin >> i; char ENG [] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char eng [] = "abcdefghijklmnopqrstuvwxyz"; char RU [] = "АБВГДЭЕЖЗЫИКЛМНОПРСТУФХЦЧШЩЬЪЮЯЁ"; char ru [] = "aбвгдеёжзыиклмнопрстуфхцчшщьъюяё"; for (int h = 0;h if(i == eng[h]) > for (int b = 0;b <=33;b++) < if(i == RU[b])if(i == ru[b]) > return a.exec(); >
Отслеживать
Alex Delarge
задан 10 ноя 2017 в 6:24
Alex Delarge Alex Delarge
13 1 1 золотой знак 1 1 серебряный знак 5 5 бронзовых знаков
Выложите тип кодировки вашего исходного файла. Какой тип кодировке в системе по умолчанию? Какой язык по умолчанию?
10 ноя 2017 в 6:33
Я к тому, что вы пишите в char*, а это, максимум ASCII
10 ноя 2017 в 6:34
Распечатайте размер русского алфавита. Мне кажется там будет не 33, а 66
10 ноя 2017 в 6:34
@pavel >>будет не 33, а 66
10 ноя 2017 в 6:36
В общем, нужна кодировка. Если не велосипедить, я бы использовал обычный std::string/std::wstring и делал бы find. Без всяких циклов.
Как проверить есть ли символ в строке 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
Поиск символов в строке на языке C++
Здравствуйте! Задали написать лабораторную на языке Borland C++. Задача стоит следующая: 10. Проверить, имеется ли в заданном тексте открывающиеся и закрывающиеся круглые скобки. Заранее спасибо.
10 ответов
25 декабря 2005 года
28 / / 29.11.2005Originally posted by senator
Здравствуйте! Задали написать лабораторную на языке Borland C++. Задача стоит следующая: 10. Проверить, имеется ли в заданном тексте открывающиеся и закрывающиеся круглые скобки. Заранее спасибо.26 декабря 2005 года
32 / / 24.12.2005
спасибо тебе добрый человек 🙂
26 декабря 2005 года
726 / / 14.01.2004
Originally posted by linker3
Кушай на здоровье 🙂Твой код равносилен этому:
26 декабря 2005 года
5.6K / / 13.08.2003
вот вариант на С++, а не на С. так, для общего развития 🙂
#include
#includeusing namespace std;
int main()
string str;26 декабря 2005 года
1.4K / / 03.12.2004
Originally posted by squirL
вот вариант на С++, а не на С. так, для общего развития 🙂
#include
#includeusing namespace std;
int main()
string str;Ну а ежели говорить о Borland C++, то наверно так:
26 декабря 2005 года
5.6K / / 13.08.2003
Originally posted by AlexandrVSmirno
Ну а ежели говорить о Borland C++
:skip:
26 декабря 2005 года
1.4K / / 03.12.2004
Originally posted by squirLЯ это к тому, что сама фирма Borland настоятельно рекумендует пользоваться типом AnsiString. Хотя, конечно stl никто не отменял.
26 декабря 2005 года
28 / / 29.11.2005
Originally posted by Matush
Твой код равносилен этому:Я кенечно человек не придлирчивый к мелочам и всегда учитываю рациональное мнение, но в условие сказано что нада проверить есть ли закрывающая «И» открывающая скобки.
Кстати я первый раз написал так как ты, но потом перечитал условие и. 🙂27 декабря 2005 года
726 / / 14.01.2004Originally posted by linker3
Я кенечно человек не придлирчивый к мелочам и всегда учитываю рациональное мнение, но в условие сказано что нада проверить есть ли закрывающая «И» открывающая скобки.
Кстати я первый раз написал так как ты, но потом перечитал условие и. 🙂Ожидал встретить такой ответ. Поэто поясняю все по-порядку.
Я написал «Твой код равносилен этому» — это означает, что приведенный мною код делает в точности тоже самое что и твой.
Условие я тоже читать умею и что самое главное понимаю его. Поэтому становится ясным что приведенный тобою и всеми другими код — нерабочий (относительно условия).
Если уловие понять так что надо проверить есть ли открывающие и закрывающие скобки и они расставлены верно, то вот код:
String. Contains Метод
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Перегрузки
Возвращает значение, указывающее, встречается ли указанный символ внутри этой строки.
Возвращает значение, указывающее, встречается ли указанная подстрока внутри этой строки.
Возвращает значение, указывающее, встречается ли указанный символ внутри этой строки, используя указанные правила сравнения.
Возвращает значение, указывающее, встречается ли указанная строка внутри этой строки, используя указанные правила сравнения.
Contains(Char)
Возвращает значение, указывающее, встречается ли указанный символ внутри этой строки.
public: bool Contains(char value);public bool Contains (char value);member this.Contains : char -> boolPublic Function Contains (value As Char) As BooleanПараметры
Символ для поиска.
Возвращаемое значение
Значение true , если параметр value выполняется внутри этой строки; в противном случае — значение false .
Комментарии
Этот метод выполняет порядковый номер (с учетом регистра и без учета языка и региональных параметров).
Применяется к
Contains(String)
Возвращает значение, указывающее, встречается ли указанная подстрока внутри этой строки.
public: bool Contains(System::String ^ value);public bool Contains (string value);member this.Contains : string -> boolPublic Function Contains (value As String) As BooleanПараметры
Строка для поиска.
Возвращаемое значение
true , если параметр value встречается в строке или value является пустой строкой («»); в противном случае — false .
Исключения
value имеет значение null .
Примеры
В следующем примере определяется, является ли строка fox подстрокой знакомой кавычки. Если в строке найдена «fox», она также отображает ее начальную позицию.
using namespace System; int main() < String^ s1 = "The quick brown fox jumps over the lazy dog"; String^ s2 = "fox"; bool b = s1->Contains( s2 ); Console::WriteLine( "Is the string, s2, in the string, s1?: ", b ); if (b) < int index = s1->IndexOf(s2); if (index >= 0) Console::WriteLine("' begins at character position ", s2, index + 1); > > // This example displays the following output: // 'fox' is in the string 'The quick brown fox jumps over the lazy dog': True // 'fox begins at character position 17string s1 = "The quick brown fox jumps over the lazy dog"; string s2 = "fox"; bool b = s1.Contains(s2); Console.WriteLine("'' is in the string '': ", s2, s1, b); if (b) < int index = s1.IndexOf(s2); if (index >= 0) Console.WriteLine("' begins at character position ", s2, index + 1); > // This example displays the following output: // 'fox' is in the string 'The quick brown fox jumps over the lazy dog': True // 'fox begins at character position 17let s1 = "The quick brown fox jumps over the lazy dog" let s2 = "fox" let b = s1.Contains s2 printfn $"'' is in the string '': " if b then let index = s1.IndexOf s2 if index >= 0 then printfn $"' begins at character position " // This example displays the following output: // 'fox' is in the string 'The quick brown fox jumps over the lazy dog': True // 'fox begins at character position 17Class Example Public Shared Sub Main() Dim s1 As String = "The quick brown fox jumps over the lazy dog" Dim s2 As String = "fox" Dim b As Boolean = s1.Contains(s2) Console.WriteLine("'' is in the string '': ", s2, s1, b) If b Then Dim index As Integer = s1.IndexOf(s2) If index >= 0 Then Console.WriteLine("' begins at character position ", s2, index + 1) End If End If End Sub End Class ' ' This example displays the following output: ' 'fox' is in the string 'The quick brown fox jumps over the lazy dog': True ' 'fox begins at character position 17Комментарии
Этот метод выполняет порядковый номер (с учетом регистра и без учета языка и региональных параметров). Поиск начинается с первой позиции символа этой строки и продолжается до последней позиции символа.
Чтобы выполнить сравнение с учетом языка и региональных параметров или порядкового номера без учета регистра:
- В .NET Core 2.1 и более поздних версиях: вместо этого вызовите перегрузку Contains(String, StringComparison) .
- На платформа .NET Framework: создайте пользовательский метод. В следующем примере показан один из таких подходов. Он определяет String метод расширения, который включает StringComparison параметр и указывает, содержит ли строка подстроку при использовании указанной формы сравнения строк.
using System; public static class StringExtensions < public static bool Contains(this String str, String substring, StringComparison comp) < if (substring == null) throw new ArgumentNullException("substring", "substring cannot be null."); else if (! Enum.IsDefined(typeof(StringComparison), comp)) throw new ArgumentException("comp is not a member of StringComparison", "comp"); return str.IndexOf(substring, comp) >= 0; > >open System open System.Runtime.CompilerServices [] type StringExtensions = [] static member Contains(str: string, substring, comp: StringComparison) = if substring = null then invalidArg "substring" "substring cannot be null" if Enum.IsDefined(typeof, comp) |> not then invalidArg "comp" "comp is not a member of StringComparison" str.IndexOf(substring, comp) >= 0String s = "This is a string."; String sub1 = "this"; Console.WriteLine("Does '' contain ''?", s, sub1); StringComparison comp = StringComparison.Ordinal; Console.WriteLine(" : ", comp, s.Contains(sub1, comp)); comp = StringComparison.OrdinalIgnoreCase; Console.WriteLine(" : ", comp, s.Contains(sub1, comp)); // The example displays the following output: // Does 'This is a string.' contain 'this'? // Ordinal: False // OrdinalIgnoreCase: Truelet s = "This is a string." let sub1 = "this" printfn $"Does '' contain ''?" let comp = StringComparison.Ordinal printfn $" :" let comp2 = StringComparison.OrdinalIgnoreCase printfn $" : " // The example displays the following output: // Does 'This is a string.' contain 'this'? // Ordinal: False // OrdinalIgnoreCase: True Imports System.Runtime.CompilerServices Module StringExtensions Public Function Contains(str As String, substring As String, comp As StringComparison) As Boolean If substring Is Nothing Then Throw New ArgumentNullException("substring", "substring cannot be null.") Else If Not [Enum].IsDefined(GetType(StringComparison), comp) Throw New ArgumentException("comp is not a member of StringComparison", "comp") End If Return str.IndexOf(substring, comp) >= 0 End Function End ModulePublic Module Example Public Sub Main Dim s As String = "This is a string." Dim sub1 As String = "this" Console.WriteLine("Does '' contain ''?", s, sub1) Dim comp As StringComparison = StringComparison.Ordinal Console.WriteLine(" : ", comp, s.Contains(sub1, comp)) comp = StringComparison.OrdinalIgnoreCase Console.WriteLine(" : ", comp, s.Contains(sub1, comp)) End Sub End Module ' The example displays the following output: ' Does 'This is a string.' contain 'this'? ' Ordinal: False ' OrdinalIgnoreCase: TrueЕсли вас интересует позиция подстроки value в текущем экземпляре, можно вызвать IndexOf метод , чтобы получить начальную позицию первого вхождения, или метод LastIndexOf , чтобы получить начальную позицию последнего вхождения. Пример включает вызов метода , IndexOf(String) если подстрока найдена в экземпляре строки.
См. также раздел
- IndexOf(Char)
- LastIndexOf(String)