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

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

  • автор:

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

    Originally 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
    #include

    using namespace std;

    int main()
    string str;

    26 декабря 2005 года
    1.4K / / 03.12.2004
    Originally posted by squirL
    вот вариант на С++, а не на С. так, для общего развития 🙂
    #include
    #include

    using 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.2004

    Originally posted by linker3
    Я кенечно человек не придлирчивый к мелочам и всегда учитываю рациональное мнение, но в условие сказано что нада проверить есть ли закрывающая «И» открывающая скобки.
    Кстати я первый раз написал так как ты, но потом перечитал условие и. 🙂

    Ожидал встретить такой ответ. Поэто поясняю все по-порядку.

    Я написал «Твой код равносилен этому» — это означает, что приведенный мною код делает в точности тоже самое что и твой.

    Условие я тоже читать умею и что самое главное понимаю его. Поэтому становится ясным что приведенный тобою и всеми другими код — нерабочий (относительно условия).

    Если уловие понять так что надо проверить есть ли открывающие и закрывающие скобки и они расставлены верно, то вот код:

    Строки в языке C

    Строка — это последовательность ASCII или UNICODE символов.

    Строки в C, как и в большинстве языков программирования высокого уровня рассматриваются как отдельный тип, входящий в систему базовых типов языка. Так как язык C по своему происхождению является языком системного программирования, то строковый тип данных в C как таковой отсутствует, а в качестве строк в С используются обычные массивы символов.

    Исторически сложилось два представления формата строк:

    1. формат ANSI;
    2. cтроки с завершающим нулем (используется в C).

    Формат ANSI устанавливает, что значением первой позиции в строке является ее длина, а затем следуют сами символы строки. Например, представление строки «Моя строка!» будет следующим:

    11 ‘М’ ‘о’ ‘я’ ‘ ‘ ‘с’ ‘т’ ‘р’ ‘о’ ‘к’ ‘а’ ‘!’
    В строках с завершающим нулем, значащие символы строки указываются с первой позиции, а признаком завершения строки является значение ноль. Представление рассмотренной ранее строки в этом формате имеет вид:

    ‘М’ ‘о’ ‘я’ ‘ ‘ ‘с’ ‘т’ ‘р’ ‘о’ ‘к’ ‘а’ ‘!’ 0

    Объявление строк в C

    Строки реализуются посредством массивов символов. Поэтому объявление ASCII строки имеет следующий синтаксис:

    char имя[длина];
    Объявление строки в С имеет тот же синтаксис, что и объявление одномерного символьного массива. Длина строки должна представлять собой целочисленное значение (в стандарте C89 – константа, в стандарте C99 может быть выражением). Длина строки указывается с учетом одного символа на хранение завершающего нуля, поэтому максимальное количество значащих символов в строке на единицу меньше ее длины. Например, строка может содержать максимально двадцать символов, если объявлена следующим образом:
    char str[21]; Инициализация строки в С осуществляется при ее объявлении, используя следующий синтаксис:
    char str[длина] = строковый литерал;

    Строковый литерал – строка ASCII символов заключенных в двойные кавычки. Примеры объявления строк с инициализацией:

    char str1[20] = «Введите значение: «, str2[20] = «»;

    const char message[] = «Сообщение об ошибке!»;

    Работа со строками в С

    Так как строки на языке С являются массивами символов, то к любому символу строки можно обратиться по его индексу. Для этого используется синтаксис обращения к элементу массива, поэтому первый символ в строке имеет индекс ноль. Например, в следующем фрагменте программы в строке str осуществляется замена всех символов ‘a’ на символы ‘A’ и наоборот.

    for(int i = 0; str[i] != 0; i++)
    if (str[i] == ‘a’) str[i] = ‘A’;
    else if (str[i] == ‘A’) str[i] = ‘a’;
    >

    Массивы строк в С

    Объявление массивов строк в языке С также возможно. Для этого используются двумерные массивы символов, что имеет следующий синтаксис:
    char имя[количество][длина];

    Первым размером матрицы указывается количество строк в массиве, а вторым – максимальная (с учетом завершающего нуля) длина каждой строки. Например, объявление массива из пяти строк максимальной длиной 30 значащих символов будет иметь вид:

    При объявлении массивов строк можно производить инициализацию:
    char имя[количество][длина] = ;

    Число строковых литералов должно быть меньше или равно количеству строк в массиве. Если число строковых литералов меньше размера массива, то все остальные элементы инициализируются пустыми строками. Длина каждого строкового литерала должна быть строго меньше значения длины строки (для записи завершающего нуля).

    char days[12][10] = <
    «Январь», «Февраль», «Март», ”Апрель», «Май»,
    «Июнь», «Июль», «Август», «Сентябрь»,»Октябрь»,
    «Ноябрь», «Декабрь»
    >;

    При объявлении массивов строк с инициализацией допускается не указывать количество строк в квадратных скобках. В таком случае, количество строк в массиве будет определено автоматически по числу инициализирующих строковых литералов.
    Например, массив из семи строк:

    char days[][12] = <
    «Понедельник», «Вторник», «Среда», «Четверг»,
    «Пятница», «Суббота», «Воскресенье»
    >;

    Функции для работы со строками в С

    Все библиотечные функции, предназначенные для работы со строками, можно разделить на три группы:

    1. ввод и вывод строк;
    2. преобразование строк;
    3. обработка строк.

    Ввод и вывод строк в С

    Для ввода и вывода строковой информации можно использовать функции форматированного ввода и вывода (printf и scanf). Для этого в строке формата при вводе или выводе строковой переменной необходимо указать спецификатор типа %s. Например, ввод и последующий вывод строковой переменной будет иметь вид:

    char str[31] = «»;
    printf(«Введите строку: «);
    scanf(«%30s”,str);
    printf(«Вы ввели: %s”,str);

    Недостатком функции scanf при вводе строковых данных является то, что символами разделителями данной функции являются:

    1. перевод строки,
    2. табуляция;
    3. пробел.

    Поэтому, используя данную функцию невозможно ввести строку, содержащую несколько слов, разделенных пробелами или табуляциями. Например, если в предыдущей программе пользователь введет строку: «Сообщение из нескольких слов», то на экране будет выведено только «Сообщение».
    Для ввода и вывода строк в библиотеке stdio.h содержатся специализированные функции gets и puts.

    Функция gets предназначена для ввода строк и имеет следующий заголовок:
    char * gets(char *buffer);

    Между тем использовать функцию gets категорически не рекомендуется, ввиду того, что она не контролирует выход за границу строки, что может произвести к ошибкам. Вместо нее используется функция fgets с тремя параметрами:

    char * fgets(char * buffer, int size, FILE * stream);

    где buffer — строка для записи результата, size — максимальное количество байт, которое запишет функция fgets, stream — файловый объект для чтения данных, для чтения с клавиатуры нужно указать stdin. Эта функция читает символы со стандартного ввода, пока не считает n — 1 символ или символ конца строки, потом запишет считанные символы в строку и добавит нулевой символ. При этом функция fgets записывает в том символ конца строки в данную строку, что нужно учитывать.

    Функция puts предназначена для вывода строк и имеет следующий заголовок:
    int puts(const char *string);

    Простейшая программа: ввод и вывод строки с использованием функций fgets и puts будет иметь вид:

    char str[102] = «»;
    printf(«Введите строку: «);
    fgets(str, 102, stdin);
    printf(«Вы ввели: «);
    puts(str);

    Для считывания одного символа можно использовать функцию fgetc(FILE * stream) . Она считывает один символ и возвращает значение этого символа, преобразованное к типу int, если же считывание не удалось, то возвращается специальная константа EOF, равная -1. Функция возвращает значение -1 для того, чтобы можно было обрабатывать ситуацию конца файла, посимвольное чтение до конца файла можно реализовать следующим образом:

    int c;
    while ((c = fgetc(stdin)) != EOF) // Обработка символа
    >

    Для вывода одного символа можно использовать функцию int fputc(int c, FILE *stream); .

    Помимо функций ввода и вывода в потоки в библиотеке stdio.h присутствуют функции форматированного ввода и вывода в строки. Функция форматированного ввода из строки имеет следующий заголовок:

    int sscanf(const char * restrict buffer, const char * restrict string, [address] . );

    Функции форматированного вывода в строку имеют следующие заголовки:

    int sprintf(char * restrict buffer,
    const char * restrict format, [argument] . );
    int snprintf(char * restrict buffer, size_t maxsize,
    const char * restrict format, [argument] . );

    Преобразование строк

    В С для преобразования строк, содержащих числа, в численные значения в библиотеке stdlib.h
    предусмотрен следующий набор функций:
    double atof(const char *string); // преобразование строки в число типа double
    int atoi(const char *string); // преобразование строки в число типа int
    long int atol(const char *string); // преобразование строки в число типа long int
    long long int atoll(const char *string); // преобразование строки в число типа long long int

    Корректное представление вещественного числа в текстовой строке должно удовлетворять формату:

    После символов E, e указывается порядок числа. Корректное представление целого числа в текстовой строке должно удовлетворять формату:

    Помимо приведенных выше функций в библиотеке stdlib.h доступны также следующие функции преобразования строк в вещественные числа:

    float strtof(const char * restrict string, char ** restrict endptr);
    double strtod(const char * restrict string, char ** restrict endptr);
    long double strtold(const char * restrict string,char ** restrict endptr);

    Аналогичные функции присутствуют и для преобразования строк в целочисленные значения:

    long int strtol(const char * restrict string, char ** restrict endptr, int base);
    unsigned long strtoul(const char * restrict string,
    char ** restrict endptr, int base);
    long long int strtoll(const char * restrict string,
    char ** restrict endptr, int base);
    unsigned long long strtoull(const char * restrict string,char ** restrict endptr, int base);

    Функции обратного преобразования (численные значения в строки) в библиотеке stdlib.h присутствуют, но они не регламентированы стандартом, и рассматриваться не будут. Для преобразования численных значений в строковые наиболее удобно использовать функции sprintf и snprintf.

    Обработка строк

    В библиотеке string.h содержаться функции для различных действий над строками.
    Функция вычисления длины строки:
    size_t strlen(const char *string);

    char str[] = «1234»;
    int n = strlen(str); //n == 4

    Функции копирования строк:

    char * strcpy(char * restrict dst, const char * restrict src);
    char * strncpy(char * restrict dst, const char * restrict src, size_t num);

    Функции сравнения строк:

    int strcmp(const char *string1, const char *string2);
    int strncmp(const char *string1, const char *string2,size_t num);

    Функции осуществляют сравнение строк по алфавиту и возвращают:

    положительное значение – если string1 больше string2;
    отрицательное значение – если string1 меньше string2;
    нулевое значение – если string1 совпадает с string2;

    Функции объединения (конкатенации) строк:

    char * strcat(char * restrict dst, const char * restrict src);
    char * strncat(char * restrict dst, const char * restrict src, size_t num);

    Функции поиска символа в строке:

    char * strchr(const char *string, int c);
    char * strrchr(const char *string, int c);

    Функция поиска строки в строке:
    char * strstr(const char *str, const char *substr);

    char str[] = «Строка для поиска»;
    char *str1 = strstr(str,»для»); //str1 == «для поиска»

    Функция поиска первого символа в строке из заданного набора символов:
    size_t strcspn(const char *str, const char *charset);

    Функции поиска первого символа в строке не принадлежащему заданному набору символов:
    size_t strspn(const char *str, const char *charset);

    Функции поиска первого символа в строке из заданного набора символов:
    char * strpbrk(const char *str, const char *charset);

    Функция поиска следующего литерала в строке:
    char * strtok(char * restrict string, const char * restrict charset);

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

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

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