strncmp — Сравнение первых n символов строк без учета регистра


Бинарно-безопасное сравнение первых n символов строк без учета регистра

(PHP 4 >= 4.0.2, PHP 5, PHP 7)

strncasecmp — Бинарно-безопасное сравнение первых n символов строк без учета регистра

Описание

Эта функция подобна strcasecmp() , за исключением того, что можно указать максимальное количество символов в обоих строках, которые будут участвовать в сравнении.

Список параметров

Количество символов, участвующих в сравнении.

Возвращаемые значения

Возвращает отрицательное число, если str1 меньше, чем str2 , положительное число, если str1 больше, чем str2 , и 0 если строки равны.

Смотрите также

  • strncmp() — Бинарно-безопасное сравнение первых n символов строк
  • preg_match() — Выполняет проверку на соответствие регулярному выражению
  • substr_compare() — Бинарно-безопасное сравнение 2 строк со смещением, с учетом или без учета регистра
  • strcasecmp() — Бинарно-безопасное сравнение строк без учета регистра
  • stristr() — Регистронезависимый вариант функции strstr
  • substr() — Возвращает подстроку

Описание функций языка Си

All | _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

strncmp – сравнение строк с ограничением количества сравниваемых символов.

#include
int strncmp(const char *str1, const char *str2, size_t n);

str1, str2 – указатели на сравниваемые строки.
size_t n – количество символов для сравнения.

0 – если первые n символов сравниваемых строк идентичны.

Положительное число – если в первых n символах сравниваемых строк есть отличия и код первого отличающегося символа в строке str1 больше кода символа на той же позиции в строке str2.

Отрицательное число – в первых n символах сравниваемых строк есть отличия и код первого отличающегося символа в строке str1 меньше кода символа на той же позиции в строке str2.

Функция побайтно сравнивает коды символов двух строк, на которые указывают аргументы функции.

Сравнение прекращается если встретились отличающиеся символы. При этом возвращается отрицательное или положительное число (см. возвращаемые значения).

Если были проверены n символов или обе сравниваемые строки закончились, и отличий не было, то сравнение прекращается и возвращается ноль.

В примере сравниваются первые 5 символов двух строк, и результат сравнения выводится на экран.

strncasecmp — Бинарно-безопасное сравнение первых n символов строк без учета регистра

(PHP 4 >= 4.0.2, PHP 5, PHP 7)

strncasecmp — Бинарно-безопасное сравнение первых n символов строк без учета регистра

Описание

Эта функция подобна strcasecmp() , за исключением того, что можно указать максимальное количество символов в обоих строках, которые будут участвовать в сравнении.

Список параметров

Количество символов, участвующих в сравнении.

Возвращаемые значения

Возвращает отрицательное число, если str1 меньше, чем str2 , положительное число, если str1 больше, чем str2 , и 0 если строки равны.

Смотрите также

  • strncmp() — Бинарно-безопасное сравнение первых n символов строк
  • preg_match() — Выполняет проверку на соответствие регулярному выражению
  • substr_compare() — Бинарно-безопасное сравнение 2 строк со смещением, с учетом или без учета регистра
  • strcasecmp() — Бинарно-безопасное сравнение строк без учета регистра
  • stristr() — Регистронезависимый вариант функции strstr
  • substr() — Возвращает подстроку

Сравнение строк без учета регистра символов

Сравнение строк без учета регистра символов

Если вам когда-либо доводилось писать программы, в которых используются строки (а кому, спрашивается, не доводилось?), скорее всего, вы встречались с типичной ситуацией — две строки, различающиеся только регистром символов, должны были интерпретироваться как равные. В этих случаях требовалось, чтобы операции сравнения — проверка равенства, больше-меньше, выделение подстрок, сортировка — игнорировали регистр символов. Программисты очень часто спрашивают, как организовать подобные операции средствами стандартной библиотеки С++. На этот вопрос существует огромное количество ответов, многие из которых неверны.

Прежде всего необходимо избавиться от мысли о написании класса, сравнивающего строки без учета регистра. Да, с технической точки зрения это более или менее возможно. Тип std:: string стандартной библиотеки в действительности является синонимом для типа std::basic_string ,sd:: allocator >. Операции сравнения определяются вторым параметром; передавая второй параметр с переопределенными операциями «равно» и «меньше», можно специализировать basic_string таким образом, что операции >). Параметры характеристик (traits) должны совпадать. Если вы используете строки типа std:: basic_string , то для вывода строк должен использоваться тип std::basic_ostream . Стандартные потоки cin и cout для этой цели не подойдут.

Игнорирование регистра символов является не свойством объекта, а лишь контекстом его использования. Вполне возможно, что в одном контексте строки должны интерпретироваться с учетом регистра, а в другом контексте регистр должен игнорироваться (например, при установке соответствующего режима пользователем).

Решение не соответствует канонам. Класс char_traits, как и все классы характеристик[5], прост, компактен и не содержит информации состояния. Как будет показано ниже, правильная реализация сравнений без учета регистра не отвечает ни одному из этих критериев.

Этого вообще не достаточно. Даже если все функции basic_string будут игнорировать регистр, это никак не отразится на использовании внешних обобщенных алгоритмов, таких как std::search и std::find_end. Кроме того, такое решение перестает работать, если по соображениям эффективности перейти от контейнера объектов basicstring к таблице строк.

Более правильное решение, которое лучше соответствует архитектуре стандартной библиотеки, заключается в том, чтобы игнорировать регистр символов только в тех случаях, когда это действительно необходимо. Не стоит возиться с такими функциями контейнера string, как string::find_first или string::rfind; они лишь дублируют функциональные возможности, уже поддерживаемые внешними обобщенными алгоритмами. С другой стороны, алгоритмы обладают достаточной гибкостью, что позволяет реализовать в них поддержку сравнений строк без учета регистра. Например, чтобы отсортировать коллекцию строк без учета регистра, достаточно передать алгоритму працильный объект функции сравнения:

std::sort(С.begin(), С.end().compare_wi thout_case);

Написанию таких объектов и посвящена эта статья.

Сравнение строк без учета регистра в C++ [закрыто]

каков наилучший способ сравнения строк без учета регистра в C++ без преобразования строки во все прописные или все строчные буквы?

пожалуйста, укажите, являются ли методы Unicode дружественными и насколько они портативны.

30 ответов

Boost включает удобный алгоритм для этого:


воспользуйтесь стандартным char_traits . Напомним, что std::string на самом деле typedef для std::basic_string , или, более явно, std::basic_string > . The char_traits type описывает, как сравниваются символы, как они копируются, как они отливают и т. д. Все, что вам нужно сделать, это typedef новую строку над basic_string , и обеспечить его с вашим собственным char_traits что сравнить случай нечувствительно.

вы говорите о тупом нечувствительном к регистру сравнении или полном нормализованном сравнении Unicode?

немое сравнение не найдет строки, которые могут быть одинаковыми, но не являются двоичными равными.

Илон Маск рекомендует:  Что такое код ocicolumntype

являются равнозначными, но они также имеют разные двоичные представления.

что сказал:Нормализации Unicode должен быть обязательным для чтения, особенно если вы планируете поддерживать хангыль, Thaï и другие азиатские языки.

кроме того, IBM в значительной степени запатентовала большинство оптимизированных алгоритмов Unicode и сделала их общедоступными. Они также поддерживают реализацию : IBM ICU

Если вы находитесь в системе POSIX, вы можете использовать strcasecmp. Однако эта функция не является частью стандарта C и не доступна в Windows. Это будет выполнять сравнение без учета регистра на 8-битных символах, если языковой стандарт POSIX. Если языковой стандарт не POSIX, результаты не определены (поэтому он может выполнять локализованное сравнение или нет). Широкосимвольный эквивалент недоступен.

в противном случае, большое количество исторической библиотеки C реализация функции stricmp() и strnicmp(). Visual C++ в Windows переименовал все из них, добавив к ним подчеркивание, потому что они не являются частью стандарта ANSI, поэтому в этой системе они называются _stricmp или _strnicmp. Некоторые библиотеки могут также иметь широкосимвольные или многобайтовые эквивалентные функции (обычно называемые, например, wcsicmp, mbcsicmp и т. д.).

C и C++ в значительной степени не знают о проблемах интернационализации, поэтому нет ничего хорошего решение этой проблемы, за исключением использования сторонней библиотеки. Проверьте IBM ICU (международные компоненты для Unicode) Если вам нужна надежная библиотека для C/с++. ICU предназначен для систем Windows и Unix.

проблема с boost заключается в том, что вы должны связать и зависеть от boost. Не легко в некоторых случаях (например, android).

и, используя средства char_traits все ваши сравнения нечувствительны к регистру, что обычно не то, что вы хотите.

этого должно хватить. Он должен быть достаточно эффективным. Не обрабатывает unicode или что-то еще.

обновление: бонусная версия c++14 ( #include ):

Сравнение строк без учета регистра в C++

Каков наилучший способ сравнения строк без учета регистра в C++ без преобразования строки в верхний или нижний регистр?

Пожалуйста, укажите, являются ли методы удобными для Unicode и насколько они переносимы.

31 ответ

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Boost включает в себя удобный алгоритм для этого:

Воспользуйтесь преимуществом стандарта char_traits . Напомним, что std::string на самом деле является typedef для std::basic_string , или, более явно, std::basic_string > . char_traits type описывает, как символы сравниваются, как они копируются, как они преобразуются и т. д. Все, что вам нужно сделать, это ввести typedef новую строку поверх basic_string , и предоставьте свой собственный char_traits что сравнивать регистр нечувствительно.

Проблема с бустом в том, что вы должны связываться с бустом и зависеть от него. Не легко в некоторых случаях (например, Android).

А использование char_traits означает, что все ваши сравнения нечувствительны к регистру, что обычно не то, что вам нужно.

Этого должно быть достаточно. Это должно быть достаточно эффективным. Не обрабатывает Unicode или что-то еще, хотя.

Обновление: Бонус C++ 14 версия ( #include ):

Если вы находитесь в системе POSIX, вы можете использовать strcasecmp. Однако эта функция не является частью стандартного C и не доступна в Windows. Это будет выполнять сравнение без учета регистра для 8-битных символов, при условии, что языковой стандарт — POSIX. Если языковой стандарт не POSIX, результаты не определены (поэтому может выполняться локальное сравнение или нет). Эквивалент широких символов недоступен.

В противном случае большое количество исторических реализаций библиотеки C имеют функции stricmp() и strnicmp(). Visual C++ в Windows переименовал все это, поставив перед ними знак подчеркивания, потому что они не являются частью стандарта ANSI, поэтому в этой системе их называют _stricmp или _strnicmp. Некоторые библиотеки могут также иметь широкие или многобайтовые эквивалентные функции (обычно называемые, например, wcsicmp, mbcsicmp и т.д.).

C и C++ в значительной степени не знают о проблемах интернационализации, поэтому у этой проблемы нет иного решения, кроме как использовать стороннюю библиотеку. Проверять, выписываться IBM ICU (международные компоненты для Unicode) если вам нужна надежная библиотека для C/C++. ICU для систем Windows и Unix.

Вы говорите о тупом сравнении без учета регистра или полном нормализованном сравнении Unicode?

При немом сравнении не будут найдены строки, которые могут быть одинаковыми, но не равными двоичным.

Все они эквивалентны, но они также имеют разные двоичные представления.

Это сказало, Нормализация Юникода обязательно прочитайте, особенно если вы планируете поддерживать хангыль, тайский и другие азиатские языки.

Кроме того, IBM в значительной степени запатентовала наиболее оптимизированные алгоритмы Unicode и сделала их общедоступными. Они также поддерживают реализацию: IBM ICU

boost :: iequals не совместим с utf-8 в случае строки. Ты можешь использовать повышение :: локаль.

  • Основной — игнорировать ударения и регистр символов, сравнивая только базовые буквы. Например, «фасад» и «фасад» — это одно и то же.
  • Вторичный — игнорировать регистр символов, но учитывать акценты. «фасад» и «фасад» различны, но «фасад» и «фасад» одинаковы.
  • Третичный — рассмотрим как корпус, так и ударения: «Фасад» и «Фасад» различны. Игнорировать знаки препинания
  • Четвертичный — рассмотреть все случаи, акценты и знаки препинания. Слова должны быть идентичны с точки зрения представления Unicode.
  • Идентично — как четвертичное, но сравните также и кодовые точки.

Моей первой мыслью для не-юникодной версии было сделать что-то вроде этого:

Стандартная библиотека работы со строками

Работа № 3

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

Цель работы

Изучить организацию строк символов в языке Си; ознакомиться со стандартной библиотекой работы со строками; научиться осуществлять ввод/вывод и обработку строк символов.

Теоретические сведения

Строковые литералы

Особым случаем массива является строковый литерал – последовательность любых символов, заключенных в парные двойные кавычки. В Си отсутствует специальный строковый тип. Вместо этого строковый литерал представляется как массив элементов типа char, в конце которого помещен символ ‘\0’ (нуль-терминатор). Такой массив называют строкой в формате ASCIIZ или просто ASCIIZ-строкой. Как и с любым массивом символов, со строковым литералом связан указатель-константа на первый элемент массива.

Адрес первого символа строкового литерала используется по-разному, в зависимости от того, для чего используется литерал. Если строковый литерал применяется для инициализации массива типа char, адрес его первого символа становится синонимом имени массива. Например:

char str[] = «строка»;

char str[7] = «строка»;

Если литерал используется для инициализации указателя типа char *, адрес первого символа литерала будет начальным значением указателя. Например:

Если литерал используется в выражении в тех местах, где разрешается применять указатель, компилятор подставляет в выражение вместо литерала адрес первого его символа. Например:

При выполнении операции присваивания, в ячейку памяти, отведенную для указателя str, пересылается не массив символов, а только указатель на его начало.


В зависимости от настроек Turbo C для каждого строкового литерала может быть создана своя ASCIIZ-строка, либо использована ссылка на уже имеющийся аналогичный литерал (например, если в программе четыре раза встречается строка символов «Введите целое число: «). По умолчанию используется первый вариант.

Илон Маск рекомендует:  substr - Возвращает подстроку

Стандартная библиотека работы со строками

Наиболее типичные операции над строковыми данными оформлены в виде функций стандартной библиотеки работы со строками, подключаемой к программе с помощью файла-заголовка string.h:

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

Из набора функций библиотеки при выполнении данной лабораторной работы могут быть использованы следующие.

· strcpy(char* dst, char* src) – копирование строки, адресованной src, в область памяти, на которую указывает dst. Функция возвращает указатель на начало скопированной строки.

· stpcpy(char* dst, char* src) – выполняет то же, что и предыдущая функция, но возвращает указатель на конец результирующей строки.

· strncpy(char* dst, char* src, size_t n) – действие аналогично функции strcpy, но копируются только первые n символов строки src (или меньше, если длина строки меньше n). Тип size_t – целочисленный тип, используемый стандартными функциями Си для хранения индексов массивов.

· strdup(char* s) – выделяет память и копирует в нее содержимое строки s. Возвращает указатель на начало строки-копии или константу NULL, если выделение памяти завершилось неудачей.

· strlwr(char* s), strupr(char* s) – преобразует все латинские символы строки s соответственно к нижнему и к верхнему регистру.

· strrev(char* s) – меняет порядок следования символов строки на противоположный.

· strcat(char* dst, char* src) – присоединяет строку src в конец строки dst. В результате dst содержит в себе две строки (но только один нуль-терминатор).

· strncat(char* dst, char* src, size_t n) – аналогично предыдущей функции, но действие распространяется только на n первых символов строки src.

· strset(char* s, int ch) – заполняет все позиции строки s символом ch.

· strnset(char* s, int ch, size_t n) – то же для первых n символов строки s.

· strcmp(const char* s1, const char *s2) – сравнивает строки, заданные константными указателями s1 и s2, в лексикографическом порядке с учетом различия прописных и строчных букв. Возвращает нуль, если обе строки идентичны, значение меньше нуля, если строка s1 расположена в упорядоченном по алфавиту «словаре» раньше, чем s2, или значение больше нуля в противном случае.

· stricmp(const char* s1, const char *s2) – то же, но без учета разницы между прописными и строчными латинскими буквами.

· strncmp(const char* s1, const char *s2, size_t n), strnicmp(const char* s1, const char *s2, size_t n) – аналогичные действия для первых n символов строк.

· strchr(const char* s, int ch) – возвращает указатель на первое вхождение символа ch в строку s. Нуль-терминатор также участвует в поиске. Если поиск неудачен, возвращается NULL.

· strrchr(const char* s, int ch) – то же, но возвращается указатель на последний совпавший символ в строке.

· strlen(char* s) – возвращает длину строки в байтах без учета нуль-терминатора.

· strpbrk(const char* s1, const char *s2) – сканирует строку s1, сравнивая ее со всеми символами строки s2. При первом совпадении возвращает указатель на совпавший символ в строке s1, в противном случае возвращает NULL.

· strstr(const char* s1, const char *s2) – находит место первого вхождения строки s2 в строку s1 и возвращает указатель на соответствующую позицию в s1.

· strspn(const char* s1, const char *s2) – возвращает длину сегмента строки s1, состоящего только из символов, входящих в строку s2. Нуль-терминатор не участвует в сравнении. Если строка s1 начинается с символа, не совпадающего ни с одним из символов строки s2, возвращается 0.

· strсspn(const char* s1, const char *s2) – возвращает длину сегмента строки s1, состоящего только из символов, не входящих в строку s2. Длина отсчитывается от начала строки s1.

· strtok(char* s1, const char *s2) – выделяет лексему в строке s1. Под лексемой в данном случае понимается фрагмент строки s1, ограниченный любыми из символов, встречающихся в строке s2. Возвращается указатель на выделенную лексему или NULL.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Увлечёшься девушкой-вырастут хвосты, займёшься учебой-вырастут рога 9790 — | 7665 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Сравнение строк без учета регистра в C ++ [закрыто]

Каков наилучший способ сравнения строк без учета регистра в C ++ без преобразования строки в верхний или нижний регистр?

Укажите, являются ли методы дружественными к Юникоду и насколько они переносимы. [110] 111]

31 ответ

Повышение включает удобный алгоритм для этого:

это, вероятно, можно сделать гораздо более эффективным, но вот громоздкая версия со всеми ее битами.

не такой портативный, но хорошо работает с тем, что есть на моем компьютере (не знаю, я из картинок, а не слов)

Простой способ сравнить две строки в c ++ (проверено для windows) — использовать _stricmp

Если вы хотите использовать с std :: string, пример:

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

Если у вас есть вектор строк, например:

Если вы не хотите использовать Boost-библиотеку , то здесь есть решение, использующее только стандартный C ++ заголовок io.

В начале 2013 года проект ICU, поддерживаемый IBM, является довольно хорошим ответом на это.

ICU — это «полная, портативная библиотека Unicode, которая близко отслеживает отраслевые стандарты». Для конкретной задачи сравнения строк объект Collation делает то, что вы хотите.

Проект Mozilla принял ICU для интернационализации в Firefox в середине 2012 года; обсуждение технических вопросов, включая вопросы о системах сборки и размере файла данных, можно найти здесь:

Поздно к вечеринке, но вот вариант, который использует std::locale и, следовательно, правильно обрабатывает турецкий язык:

дает вам функтор, который использует активную локаль для преобразования символов в строчные, затем вы можете использовать std::transform для генерации строчных букв:

Это также работает для строк на основе wchar_t .

Простой способ сравнения строк, которые различаются только строчными и заглавными буквами, состоит в сравнении ascii. Все прописные и строчные буквы различаются на 32 бита в таблице ASCII, используя эту информацию, мы имеем следующее .

У меня был хороший опыт использования Международных Компонентов для библиотек Unicode — они чрезвычайно мощные и предоставляют методы для преобразования, поддержки локали, рендеринга даты и времени, отображения дел (что вам не нужно t, кажется, хотят), и сопоставление , которое включает сравнение без учета регистра и акцента (и многое другое). Я использовал только версию библиотек на C ++, но, похоже, они также имеют версию Java.

Илон Маск рекомендует:  Что такое код ncurses_raw


Существуют методы для выполнения нормализованного сравнения, на которые ссылается @Coincoin, и они могут даже учитывать локаль — например (и это пример сортировки, а не строго равенство), традиционно на испанском (в Испании) буква комбинация «ll» сортирует между «l» и «m», поэтому «lz»

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

Для этого без использования Boost можно получить указатель на строку C с помощью c_str() и использовать strcasecmp :

Просто используйте strcmp() для чувствительности к регистру и strcmpi() или stricmp() для сравнения без учета регистра. Оба из которых находятся в заголовочном файле

формат:

Использование:

Выходные данные

apple и ApPlE одинаковы

a предшествует b, поэтому apple предшествует мячу

Просто обратите внимание на то, какой метод вы в конечном итоге выберете, если этот метод включает в себя использование strcmp , которое предлагают некоторые ответы:

strcmp не работает с данными Unicode в целом. В целом, он даже не работает с байтовыми кодировками Unicode, такими как utf-8, поскольку strcmp выполняет только байтовое сравнение, а кодовые точки Unicode, закодированные в utf-8, могут занимать более 1 байта. Единственный конкретный случай Unicode strcmp , который правильно обрабатывается, — это когда строка, закодированная с помощью байтовой кодировки, содержит только кодовые точки ниже U + 00FF — тогда достаточно сравнения байтов на байты.

Вы можете использовать приведенный выше код на C ++ 14, если вы не в состоянии использовать boost. Вы должны использовать std::towlower для широких символов.

Если вы работаете в системе POSIX, вы можете использовать strcasecmp . Однако эта функция не является частью стандартного C и не доступна в Windows. Это будет выполнять сравнение без учета регистра для 8-битных символов, при условии, что языковой стандарт — POSIX. Если языковой стандарт не POSIX, результаты не определены (поэтому может выполняться локальное сравнение или нет). Эквивалент широких символов недоступен.

В противном случае большое количество исторических реализаций библиотеки C имеет функции stricmp () и strnicmp (). Visual C ++ в Windows переименовал все это, поставив перед ними префикс подчеркивания, потому что они не являются частью стандарта ANSI, поэтому в этой системе их называют _stricmp или _strnicmp . Некоторые библиотеки могут также иметь широко-символьные или многобайтовые эквивалентные функции (обычно называемые, например, wcsicmp, mbcsicmp и т. Д.).

C и C ++ в значительной степени не знают о проблемах интернационализации, поэтому у этой проблемы нет иного решения, кроме как использовать стороннюю библиотеку. Проверьте IBM ICU (Международные компоненты для Unicode) , если вам нужна надежная библиотека для C / C ++. ICU для систем Windows и Unix.

Функции обработки строк в Cи

В программе строки могут определяться следующим образом:

  • как строковые константы;
  • как массивы символов;
  • через указатель на символьный тип;
  • как массивы строк.

Кроме того, должно быть предусмотрено выделение памяти для хранения строки.

Любая последовательность символов, заключенная в двойные кавычки «» , рассматривается как строковая константа .

Для корректного вывода любая строка должна заканчиваться нуль-символом ‘\0’ , целочисленное значение которого равно 0. При объявлении строковой константы нуль-символ добавляется к ней автоматически. Так, последовательность символов, представляющая собой строковую константу, будет размещена в оперативной памяти компьютера, включая нулевой байт.

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

Для помещения в строковую константу некоторых служебных символов используются символьные комбинации. Так, если необходимо включить в строку символ двойной кавычки, ему должен предшествовать символ «обратный слеш»: ‘\»‘ .

Строковые константы размещаются в статической памяти. Начальный адрес последовательности символов в двойных кавычках трактуется как адрес строки. Строковые константы часто используются для осуществления диалога с пользователем в таких функциях, как printf() .

При определении массива символов необходимо сообщить компилятору требуемый размер памяти.

Компилятор также может самостоятельно определить размер массива символов, если инициализация массива задана при объявлении строковой константой:

В этом случае имена m2 и m3 являются указателями на первые элементы массивов:

  • m2 эквивалентно &m2[0]
  • m2[0] эквивалентно ‘Г’
  • m2[1] эквивалентно ‘o’
  • m3 эквивалентно &m3[0]
  • m3[2] эквивалентно ‘x’

При объявлении массива символов и инициализации его строковой константой можно явно указать размер массива, но указанный размер массива должен быть больше, чем размер инициализирующей строковой константы:

Для задания строки можно использовать указатель на символьный тип .

В этом случае объявление массива переменной m4 может быть присвоен адрес массива:

Здесь m3 является константой-указателем. Нельзя изменить m3 , так как это означало бы изменение положения (адреса) массива в памяти, в отличие от m4 .

Для указателя можно использовать операцию увеличения (перемещения на следующий символ):

Массивы символьных строк

Иногда в программах возникает необходимость описание массива символьных строк . В этом случае можно использовать индекс строки для доступа к нескольким разным строкам.

В этом случае poet является массивом, состоящим из четырех указателей на символьные строки. Каждая строка символов представляет собой символьный массив, поэтому имеется четыре указателя на массивы. Указатель poet[0] ссылается на первую строку:
*poet[0] эквивалентно ‘П’,
*poet[l] эквивалентно ‘-‘.

Инициализация выполняется по правилам, определенным для массивов.
Тексты в кавычках эквивалентны инициализации каждой строки в массиве. Запятая разделяет соседние
последовательности.
Кроме того, можно явно задавать размер строк символов, используя описание, подобное такому:

Разница заключается в том, что такая форма задает «прямоугольный» массив, в котором все строки имеют одинаковую длину.

Сравнение последних символов без учета регистра (с предикатом?)

у меня есть std::wstring fName имя файла, для которого я хотел бы проверить если он имеет расширение .txt. Это работает:

но он чувствителен к регистру, чего я не хочу: мне нужно blah.tXt а также hello.TXT быть принятым

Это должно работать как версия без учета регистра:

но std::search вероятно, далеко от оптимального, потому что он ищет, если это содержит шаблон (где-нибудь в исходной строке), и здесь мне нужно только сравнить символ за символом.

Поскольку мне нужно проверить это для миллионов имен файлов, Как я могу улучшить производительность, чтобы проверить, если имя файла имеет расширение (без учета регистра) .txt ?

Я не хочу простого решения:

давайте строчные fName в новой переменной (или даже в нижнем регистре только 4 последних символа fName )

потому что это потребует новых переменных, памяти и т. д. Могу ли я сравнить на месте, с пользовательским предикатом [](wchar_t ch1, wchar_t ch2) < return tolower(ch1) == ch2; >) ?

Примечание: я не ищу ни Boost-решений, ни подобных решений Сравнение строк без учета регистра в C ++ или много подобных вопросов, которые не оптимизированы для производительности.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL