Проверка наличия символа в строке 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
Я кенечно человек не придлирчивый к мелочам и всегда учитываю рациональное мнение, но в условие сказано что нада проверить есть ли закрывающая «И» открывающая скобки.
Кстати я первый раз написал так как ты, но потом перечитал условие и. 🙂Ожидал встретить такой ответ. Поэто поясняю все по-порядку.
Я написал «Твой код равносилен этому» — это означает, что приведенный мною код делает в точности тоже самое что и твой.
Условие я тоже читать умею и что самое главное понимаю его. Поэтому становится ясным что приведенный тобою и всеми другими код — нерабочий (относительно условия).
Если уловие понять так что надо проверить есть ли открывающие и закрывающие скобки и они расставлены верно, то вот код:
Как проверить есть ли символ в строке c
Регистрация: 30.11.2016
Сообщений: 1
[СИ] Определить наличие заданных символов в строке
Помогите доделать программу. Мне нужно составить программу, которая определяет есть ли в строке буквы d,o,g и считает сколько раз они встречаются в ней.
Вот моя программа:#include #include #include #include #include int main(void)if(s[i]=='o') if(s[i]=='g') if(s[i]=='D') if(s[i]=='O') if(s[i]=='G') > if(k==0) printf("Символ d встречается %d раз\n",&a); printf("Символ o встречается %d раз\n",&b); printf("Символ g встречается %d раз\n",&c); printf("Символ D встречается %d раз\n",&d); printf("Символ O встречается %d раз\n",&e); printf("Символ G встречается %d раз\n",&f); getch(); return 0; > Она не совсем работает. Когда я ввожу строку, например, »dog» то она пишет что в строке есть только символ ‘d’. Ну и не считает сколько раз они встречаются.
Последний раз редактировалось LWM; 30.11.2016 в 13:31 .