Функция strncmp
Функция strncmp() сравнивает в лексикографическом порядке не более count символов из двух строк, заканчивающихся символом конца строки, и возвращает целое значение, зависящее от результата сравнения следующим образом:
Значение | Результат сравнения |
---|---|
Меньше нуля | str1 меньше str2 |
Нуль | str1 равен str2 |
Больше нуля | str1 больше str2 |
Если в какой-нибудь из заданных строк меньше count символов, сравнение заканчивается при обнаружении первого нулевого символа.
Пример
Следующая функция сравнивает первые восемь символов двух своих аргументов, взятых из командной строки, и выдает сообщение в случае их равенства.
C library function — strncmp()
Description
The C library function int strncmp(const char *str1, const char *str2, size_t n) compares at most the first n bytes of str1 and str2.
Declaration
Following is the declaration for strncmp() function.
Parameters
str1 − This is the first string to be compared.
str2 − This is the second string to be compared.
n − The maximum number of characters to be compared.
Return Value
This function return values that are as follows −
if Return value 0 then it indicates str2 is less than str1.
if Return value = 0 then it indicates str1 is equal to str2.
Example
The following example shows the usage of strncmp() function.
Let us compile and run the above program that will produce the following result −
strncmp — Бинарно-безопасное сравнение первых n символов строк
(PHP 4, PHP 5, PHP 7)
strncmp — Бинарно-безопасное сравнение первых n символов строк
Описание
Эта функция подобна strcmp() , за исключением того, что можно указать максимальное количество символов в обоих строках, которые будут участвовать в сравнении.
Эта функция учитывает регистр символов.
Список параметров
Количество символов, используемых в сравнении.
Возвращаемые значения
Возвращает отрицательное число, если str1 меньше, чем str2 , положительное число, если str1 больше, чем str2 , и 0 если строки равны.
Смотрите также
- strncasecmp() — Бинарно-безопасное сравнение первых n символов строк без учета регистра
- preg_match() — Выполняет проверку на соответствие регулярному выражению
- substr_compare() — Бинарно-безопасное сравнение 2 строк со смещением, с учетом или без учета регистра
- strcmp() — Бинарно-безопасное сравнение строк
- strstr() — Находит первое вхождение подстроки
- substr() — Возвращает подстроку
strncmp
strncmp — бинарно безопасное сравнение строк для первых n символов.
Описание
int strncmp (string str1, string str2, int len)
Эта функция похожа на strcmp() с той разницей, что вы можете специфицировать количество (верхнюю границу) символов (len) каждой строки, используемое при сравнении. Если любая строка короче len, то длина этой строки будет использоваться при сравнении.
Возвращает 0, если str1 больше str2; 0, если они равны.
Обратите внимание, что это сравнение с учётом регистра.
Функция strcmp(str1, str2).
После сравнения строк str1 и str2 данная функция возвратит целое значение:
Эта функция производит сравнение, различая прописные и строчные буквы
using namespace std;
using namespace std;
int k=strncmp(s1,s2, 2);
using namespace std;
int var = 123; // инициализация переменной var числом 123
int *ptrvar = &var; // указатель на переменную var (присвоили адрес переменной указателю)
Функция malloc выделяет (резервирует) из области “куча” (heap) память длиной байтов, где задается выражением типа unsigned. Функция возвращает адрес выделенной памяти в виде константы-указателя типа void.
Инициализацию указателя можно осуществить следующим образом:
int *x = (int *)malloc(sizeof(int));
Указатели и массивы. Методы ссылки на элементы массива. Привести примеры программ с использованием ссылок на языке С/C++.
В языке СИ между указателями и массивами существует тесная связь. Например, когда объявляется массив в виде int array[25], то этим определяется не только выделение памяти для двадцати пяти элементов массива, но и для указателя с именем array, значение которого равно адресу первого по счету (нулевого) элемента массива, т.е. сам массив остается безымянным, а доступ к элементам массива осуществляется через указатель с именем array. Поскольку имя массива является указателем допустимо, например, такое присваивание:
Здесь указатель ptr устанавливается на адрес первого элемента масcива.
Для доступа к элементам массива существует два различных способа. Первый способ связан с использованием обычных индексных выражений в квадратных скобках, например, array[16]=3.
Второй способ доступа к элементам массива связан с использованием адресных выражений и операции разадресации в форме *(array+16)=3. При таком способе доступа адресное выражение равное адресу шестнадцатого элемента массива тоже может быть записано разными способами *(array+16) или *(16+array).
Для доступа к начальному элементу массива (т.е. к элементу с нулевым индексом) можно использовать просто значение указателя array или ptr. Любое из присваиваний присваивает начальному элементу массива значение 2.
Пример программы с использованием ссылок на языке С/C++
using namespace std;
int main(int argc, char* argv[])
int &reference = value; // объявление и инициализация ссылки значением переменной value
using namespace std;
double summa (double array[], int n)
for(int i=0;i
— здесь мы задаем размер массива (например [n] или [25]).
Пример создания и обработки статического массива:
using namespace std;
int Arr[3] = <1,2,3>; //Инициализация массива набором значений
using namespace std;
int *arr = new int [n];
for (int i = 0; i Поскольку обе представленные функции в качестве возвращаемого значения имеют указатель на пустой тип void, требуется явное приведение типа возвращаемого значения. Для определения размера массива в байтах, используемого в качестве аргумента функции malloc()требуется количество элементов умножить на размер одного элемента. Поскольку элементами массива могут быть как данные простых типов, так и составных типов (например, структуры), для точного определения размера элемента в общем случае рекомендуется использование функции int sizeof(тип);
// Выделение памяти int * arrayPtr = (int*)malloc(n*m * sizeof(int));
Пример с calloc
int * arrayPtr = (int*) calloc(size,sizeof(int)); // выделяем память под динамический массив целых чисел
Когда динамический массив (в любой момент работы программы) перестает быть нужным, то память можно освободить с помощью оператора delete.
Пример создания, инициализации и обработки динамического массива: см. вопрос 38.
Динамические матрицы. Ввести размеры матрицы и выделить для нее место в памяти во время работы программы. Решить задачу 2 способами: выделять отдельный блок памяти для каждой строки; выделить память сразу на всю матрицу.
int **ptrarray = new int* [size1];//динамическое создание двуменого массива
strncmp
(PHP 4, PHP 5, PHP 7)
strncmp — Бинарно-безопасное сравнение первых n символов строк
Описание
Эта функция похожа на strcmp() , за исключением того, что можно указать максимальное количество символов в обеих строках, которые будут участвовать в сравнении.
Эта функция учитывает регистр символов.
Список параметров
Количество символов, используемых в сравнении.
Возвращаемые значения
Возвращает отрицательное число, если str1 меньше str2 , положительное число, если str1 больше str2 , и 0, если строки равны.
Смотрите также
- strncasecmp() — Бинарно-безопасное сравнение первых n символов строк без учета регистра
- preg_match() — Выполняет проверку на соответствие регулярному выражению
- substr_compare() — Бинарно-безопасное сравнение 2 строк со смещением, с учетом или без учета регистра
- strcmp() — Бинарно-безопасное сравнение строк
- strstr() — Находит первое вхождение подстроки
- substr() — Возвращает подстроку
User Contributed Notes 5 notes
A note not included in the documentation:
int strcmp ( string $str1 , string $str2 )
Returns 0 if str1 is greater than str2, and 0 if they are equal.
My addendum:
If str1 and str2 are not equal, and str1 is a sub-string of str2 or vise versa. The returned int value will be negative or positive indicating how many characters the difference is between the two strings in absolute terms.
= «phpaaa» ;
$str2 = «php» ;
echo strcmp ( $str1 , $str2 ); // 3
?>
since str2 = «php» is a sub-string of str1 = «phpaaa» and «phpaaa» is greater than «php» the returned value is positive and is 3 indicating how many characters the difference is between the two strings.
If you replace the value of str1 with str2 the result will be -3 (negative) but still indicates the absolute difference which is 3
I just want to highlight that (at least on php7), when testing for the existence of a string in the beginning of another string you should consider using substr or strpos (if performances is an issue).
Here is a small benchmark (for what it’s worth):
= ‘abcd’ ;
$l = strlen ( $n );
$haystack0 = base64_encode ( random_bytes ( 128 ));
//heat
$r = 1 ;
for ( $i = 0 ; $i 100000000 ; $i ++)
$r += $r * $r % 10000 ;
//tests
$k = 30000000 ;
$res = array();
foreach (array( ‘found’ => $n . $haystack0 , ‘not-found’ => strrev ( $n ) . $haystack0 ) as $f => $haystack ) <
$m = microtime ( true );
for ( $i = 0 ; $i $k ; $i ++)
! strncmp ( $haystack , $n , $l ) && $r ++;
$res [ «strncmp- $f » ] = — $m + ( $m = microtime ( true ));
for ( $i = 0 ; $i $k ; $i ++)
( strpos ( $haystack , $n ) === 0 ) && $r ++;
$res [ «strpos- $f » ] = — $m + ( $m = microtime ( true ));
for ( $i = 0 ; $i $k ; $i ++)
( substr ( $haystack , 0 , $l ) === $n ) && $r ++;
$res [ «substr- $f » ] = microtime ( true ) — $m ;
>
//print
asort ( $res );
print_r ( $res );
echo «\n $r » ; // makes sure no auto-optimization occurs
?>
This outputs:
/*
[strpos-found] => 1.3313138484955
[substr-not-found] => 1.4832630157471
[substr-found] => 1.6976611614227
[strpos-not-found] => 2.0043320655823
[strncmp-not-found] => 2.0969619750977
[strncmp-found] => 2.3616981506348
*/ ?>
I ran the following experiment to compare arrays.
1 st — using (substr($key,0,5 == «HTTP_») & 2 nd — using (!strncmp($key, ‘HTTP_’, 5))
I wanted to work out the fastest way to get the first few characters from a array
BENCHMARK ITERATION RESULT IS:
if (substr($key,0,5 == «HTTP_»). — 0,000481s
if (!strncmp($key, ‘HTTP_’, 5)). — 0,000405s
strncmp() is 20% faster than substr()
// SAMPLE FUNCTION
function strncmp_match ( $arr )
<
foreach ( $arr as $key => $val )
<
//if (substr($key,0,5 == «HTTP_»)
if (! strncmp ( $key , ‘HTTP_’ , 5 ))
<
$out [ $key ] = $val ;
>
>
return $out ;
>
will display code like this:
Array
(
[HTTP_ACCEPT] => XXX
[HTTP_ACCEPT_LANGUAGE] => pl
[HTTP_UA_CPU] => x64
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_USER_AGENT] => Mozilla/4.0
(compatible; MSIE 7.0;
Windows NT 5.1;
.NET CLR 1.1.4322;
.NET CLR 2.0.50727)
[HTTP_HOST] => XXX.XXX.XXX.XXX
[HTTP_CONNECTION] => Keep-Alive
[HTTP_COOKIE] => __utma=XX;__utmz=XX.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)
)
For checking matches at the beginning of a short string, strpos() is about 15% faster than strncmp().
Here’s a benchmark program to prove it:
= «abcdefghijklmnopqrstuvwxyz» ;
$needles = array( ‘abc’ , ‘xyz’ , ‘123’ );
foreach ( $needles as $needle ) <
$times [ ‘strncmp’ ][ $needle ] = — microtime ( true );
for ( $i = 0 ; $i 1000000 ; $i ++) <
$result = strncmp ( $haystack , $needle , 3 ) === 0 ;
>
$times [ ‘strncmp’ ][ $needle ] += microtime ( true );
>
foreach ( $needles as $needle ) <
$times [ ‘strpos’ ][ $needle ] = — microtime ( true );
for ( $i = 0 ; $i 1000000 ; $i ++) <
$result = strpos ( $haystack , $needle ) === 0 ;
>
$times [ ‘strpos’ ][ $needle ] += microtime ( true );
>
var_export ( $times );
?>
if length is 0 regardless what the two strings are, it will return 0
( «xybc» , «a3234» , 0 ); // 0
strncmp ( «blah123» , «hohoho» , 0 ); //0
?>
Функция stricmp
Читайте также:
- Анатомо-функциональные особенности спинного мозга. Пpоводниковая функция. Рефлектоpная деятельность. Висцеpальные pефлексы спинного мозга
- Анафорическая функция
- Виды отображений. Функциональное отображение (функция).
- Вторая функция сложного процента
- Группирование по технологиям (рабочим процессам) и функциям.
- Двигательная функция мышц
- Дейктическая функция
- Досуговая функция
- Игры с выпуклыми функциями выигрышей.
- Интерактивная функция общения в искусстве
- Использование логических функций. О логических функциях.
- Количество теплоты как функция процесса
Пример
Функция strcmp
Сравнение строк
Функция strncat
Пример
strcat (string, » C++»);
Переменная string содержит строку «Turbo C++».
Функция strncat добавляет к содержимому целевой строки указанное количество символов из строки-источника.
Прототип функции strcat :
char *strncat(char *target, const char *source, size_t num);
Функция добавляет к содержимому целевой строки num символов из строки-источника и возвращает указатель на целевую строку.
char strl[81] = «Hello I am «;
char str2[41] = «Keith Thompson»;
strncat(strl, str2, 5);
Переменная strl теперь содержит строку «Hello I am Keith».
Пример использования функций getline, strlen и strcat в файле List7_4.cpp (исходный код программы STRING.CPP). Программа выполняет следующие задачи:
· Предлагает вам ввести строку; ввод не должен превышать 40 символов
· Предлагает вам ввести вторую строку; ввод не должен превышать 40 символов
· Выводит число символов, содержащихся в каждой строке
· Присоединяет вторую строку к первой
· Выводит результат конкатенации
· Выводит длину объединенной строки
· Предлагает вам ввести символ для поиска
· Предлагает вам ввести символ для замены
· Выводит содержимое объединенной строки после замены символа
Поскольку строки являются массивами символов, вы не можете применить операцию сравнения для проверки равенства двух строк. Библиотека функций STRING.H предлагает набор функций для сравнения строк. Эти функции сравнивают символы двух строк, используя для этого ASCII-коды символов. Это функции strcmp, stricmp, strncmp и strnicmp.
Вообще говоря, все функции сравнения работают одинаково: возвращают 0, если две строки совпали, отрицательную величину, если вторая строка больше по величине, и положительное значение, если большей оказалась первая строка.
Функция strcmp выполняет сравнение двух строк с учетом регистра символов.
Прототип функции strcmp:
int strcmp(const char *strl, const char *str2);
Функция сравнивает строки strl и str2. Возвращает в качестве результата сравнения целую величину:
0 когда strl больше, чем str2.
char stringl[] = «Borland C++»;
char string2[] = «BORLAND C++»;
i = strcmp(string1, string2);
В последнем операторе переменной i присваивается положительное значение, так как string1 больше string2 (ASCII-коды символов в нижнем регистре больше ASCII-кодов символов в верхнем.)
Функция stricmp выполняет сравнение двух строк, не учитывая регистра символов.
Прототип функции stricmp:
int stricmp(const char *strl, const char *str2);
Функция сравнивает строки strl и str2, не делая различия между символами в нижнем и верхнем регистре. Возвращает в качестве результата сравнения целую величину:
0 когда strl больше, чем str2.
Дата добавления: 2014-01-05 ; Просмотров: 505 ; Нарушение авторских прав? ;
Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет
std:: strncmp
Language | ||||
Standard Library Headers | ||||
Freestanding and hosted implementations | ||||
Named requirements | ||||
Language support library | ||||
Concepts library (C++20) | ||||
Diagnostics library | ||||
Utilities library | ||||
Strings library | ||||
Containers library | ||||
Iterators library | ||||
Ranges library (C++20) | ||||
Algorithms library | ||||
Numerics library | ||||
Input/output library | ||||
Localizations library | ||||
Regular expressions library (C++11) | ||||
Atomic operations library (C++11) | ||||
Thread support library (C++11) | ||||
Filesystem library (C++17) | ||||
Technical Specifications |
Null-terminated strings | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Byte strings | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Multibyte strings | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Wide strings | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Classes | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Functions | ||||||||||
Character manipulation | ||||||||||
Conversions to numeric formats | ||||||||||
String manipulation | ||||||||||
String examination | ||||||||||
Memory manipulation | ||||||||||
Miscellaneous | ||||||||||
Compares at most count characters of two null-terminated byte strings. The comparison is done lexicographically. The sign of the result is the sign of the difference between the values of the first pair of characters (both interpreted as unsigned char ) that differ in the strings being compared. The behavior is undefined if lhs or rhs are not pointers to null-terminated strings. Characters following the null character are not compared. Contents[edit] Parameters
[edit] Return valueNegative value if lhs appears before rhs in lexicographical order. Zero if lhs and rhs compare equal. Positive value if lhs appears after rhs in lexicographical order. Вызывает ли strlen() выражение strncmp() цель использования strncmp() над strcmp()? — cПо моему мнению, strcmp() (no n), увидев нулевой символ в любом из аргументов, немедленно прекращает обработку и возвращает результат. На самом деле мне кажется, что вызов strncmp() , аргумент length которого является strlen() в одном из первых двух аргументов, отличается от случая strcmp() тем, что он тратит время, линейное по размеру известной строки завершения, оценивая выражение strlen() . Пример кода A: Пример кода B: Есть ли преимущества для первого над последним? Потому что я вижу, что у других людей очень много кода. Есть ли у меня некорректное понимание того, как работают эти функции?
6 ответовstrncmp() имеет ограниченное использование. Обычный strcmp() остановится, если встретится с NUL в любой из двух строк. (и в этом случае строки разные) Strncmp() остановит и вернет нуль ( «строки равны в первых N символах» ) Одно из возможных вариантов использования stncmp() — это параметры синтаксического анализа, вплоть до несущественной части, например который будет возвращать ноль для «-string» или «-state» или «-st0», но не для «-sadistic».
Теперь я согласен, что это не особенно полезно использовать strncmp(), и я не вижу никакой пользы в этом по сравнению с strcmp(). Однако, если мы изменим код, удалив +1 после strlen , тогда он станет полезным. так как это сравнивает первые 6 символов user_input с «статусом» — что, по крайней мере, иногда имеет смысл. Итак, если +1 есть, он становится регулярным strcmp — и это просто пустая трата времени, вычисляющая длину. Но без +1 это довольно полезное сравнение (при правильных обстоятельствах).
Помимо трюков, чтобы проверить, соответствует ли начало строки совпадению ввода, strncmp будет полезен только тогда, когда вы не на 100% уверены, что строка завершена до конца выделенного пространства. Итак, если у вас был буфер фиксированного размера, в который вы ввели ваш пользовательский ввод, вы можете использовать: Поэтому убедитесь, что ваше сравнение не переполняется. Однако в этом случае вам нужно быть осторожным, так как если ваш user_input не был завершен нулем, тогда действительно будет проверяться, соответствует ли user_input начало статуса.
В конкретном случае, который вы дали, он действительно бесполезен. Тем не менее, небольшое изменение более распространено: Эта версия просто проверяет, начинается ли user_input с «status» , поэтому она имеет другую семантику.
Да, да. Если вы используете strlen в strncmp, он будет пересекать указатель, пока не увидит нуль в строке. Это делает его функционально эквивалентным strcmp.
В вашем конкретном примере я бы сказал, что это вредно использовать strncmp из-за:
Все это добавляет беспорядок, и ни в одном случае вы не были бы защищены от переполнения user_input , если оно действительно было короче 6 символов и содержало те же символы, что и тестовая строка. Это было бы исключительным. Если вы знаете, что ваша строка ввода всегда имеет больше памяти, чем количество символов в тестовых строках, то не беспокойтесь. В противном случае вам может потребоваться волнение или, по крайней мере, рассмотреть его. strncmp полезен для проверки содержимого внутри больших буферов. C library function — strncmp()DescriptionThe C library function int strncmp(const char *str1, const char *str2, size_t n) compares at most the first n bytes of str1 and str2. DeclarationFollowing is the declaration for strncmp() function. Parametersstr1 − This is the first string to be compared. str2 − This is the second string to be compared. n − The maximum number of characters to be compared. Return ValueThis function return values that are as follows − if Return value 0 then it indicates str2 is less than str1. if Return value = 0 then it indicates str1 is equal to str2. ExampleThe following example shows the usage of strncmp() function. Let us compile and run the above program that will produce the following result − |