Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/string/byte/memcmp"

From cppreference.com
< cpp‎ | string‎ | byte
m (Text replace - "cpp/string/narrow" to "cpp/string/byte")
(Notes: note endianess)
 
(25 intermediate revisions by 13 users not shown)
Line 1: Line 1:
{{cpp/title| memset}}
+
{{cpp/title|memcmp}}
{{cpp/string/byte/sidebar}}
+
{{cpp/string/byte/navbar}}
{{ddcl | header=cstring |
+
{{ddcl|header=cstring|
 
int memcmp( const void* lhs, const void* rhs, std::size_t count );
 
int memcmp( const void* lhs, const void* rhs, std::size_t count );
 
}}
 
}}
  
Compares the first {{tt|count}} characters of the objects pointed to by {{tt|lhs}} and {{tt|rhs}}. The comparison is done lexicographically.
+
Reinterprets the objects pointed to by {{c|lhs}} and {{c|rhs}} as arrays of {{c/core|unsigned char}} and compares the first {{c|count}} bytes of these arrays. The comparison is done lexicographically.
 +
 
 +
The sign of the result is the sign of the difference between the values of the first pair of bytes (both interpreted as {{c/core|unsigned char}}) that differ in the objects being compared.
  
 
===Parameters===
 
===Parameters===
{{param list begin}}
+
{{par begin}}
{{param list item | lhs, rhs | pointers to the memory buffers to compare}}
+
{{par|lhs, rhs|pointers to the memory buffers to compare}}
{{param list item | count | number of bytes to examine}}
+
{{par|count|number of bytes to examine}}
{{param list end}}
+
{{par end}}
  
 
===Return value===
 
===Return value===
 +
Negative value if the first differing byte (reinterpreted as {{c/core|unsigned char}}) in {{c|lhs}} is less than the corresponding byte in {{c|rhs}}.
  
negative value if {{tt|lhs}} is ''less than'' {{tt|rhs}}.
+
{{c|0}} if all {{c|count}} bytes of {{c|lhs}} and {{c|rhs}} are equal.
  
{{cpp|0}} if {{tt|lhs}} is ''equal to'' {{tt|rhs}}.
+
Positive value if the first differing byte in {{c|lhs}} is greater than the corresponding byte in {{c|rhs}}.
  
positive value if {{tt|lhs}} is ''greater than'' {{tt|rhs}}.
+
===Notes===
 +
This function reads [[cpp/language/object#Object representation and value representation|object representations]], not the object values, and is typically meaningful for only trivially-copyable objects that have no padding. For example, {{tt|memcmp()}} between two objects of type {{lc|std::string}} or {{lc|std::vector}} will not compare their contents, {{tt|memcmp()}} between two objects of type {{c|struct { char c; int n; }<!---->}} will compare the padding bytes whose values may differ when the values of {{c|c}} and {{c|n}} are the same, and even if there were no padding bytes, the {{tt|int}} would be compared without taking into account endianness.
  
 
===Example===
 
===Example===
{{example cpp
+
{{example
|
+
|code=
| code=
+
#include <cstring>
| output=
+
#include <iostream>
 +
 
 +
void demo(const char* lhs, const char* rhs, std::size_t sz)
 +
{
 +
    std::cout << std::string(lhs, sz);
 +
    const int rc = std::memcmp(lhs, rhs, sz);
 +
    if (rc < 0)
 +
        std::cout << " precedes ";
 +
    else if (rc > 0)
 +
        std::cout << " follows ";
 +
    else
 +
        std::cout << " compares equal to ";
 +
    std::cout << std::string(rhs, sz) << " in lexicographical order\n";
 +
}
 +
 
 +
int main()
 +
{
 +
    char a1[] = {'a', 'b', 'c'};
 +
    char a2[sizeof a1] = {'a', 'b', 'd'};
 +
   
 +
    demo(a1, a2, sizeof a1);
 +
    demo(a2, a1, sizeof a1);
 +
    demo(a1, a1, sizeof a1);
 +
}
 +
|output=
 +
abc precedes abd in lexicographical order
 +
abd follows abc in lexicographical order
 +
abc compares equal to abc in lexicographical order
 
}}
 
}}
  
 
===See also===
 
===See also===
{{dcl list begin}}
+
{{dsc begin}}
{{dcl list template | cpp/string/byte/dcl list strcmp}}
+
{{dsc inc|cpp/string/byte/dsc strcmp}}
{{dcl list template | cpp/string/byte/dcl list strncmp}}
+
{{dsc inc|cpp/string/byte/dsc strncmp}}
{{dcl list end}}
+
{{dsc see c|c/string/byte/memcmp}}
 +
{{dsc end}}
 +
 
 +
{{langlinks|de|es|fr|it|ja|pt|ru|zh}}

Latest revision as of 03:19, 10 July 2023

Defined in header <cstring>
int memcmp( const void* lhs, const void* rhs, std::size_t count );

Reinterprets the objects pointed to by lhs and rhs as arrays of unsigned char and compares the first count bytes of these arrays. The comparison is done lexicographically.

The sign of the result is the sign of the difference between the values of the first pair of bytes (both interpreted as unsigned char) that differ in the objects being compared.

Contents

[edit] Parameters

lhs, rhs - pointers to the memory buffers to compare
count - number of bytes to examine

[edit] Return value

Negative value if the first differing byte (reinterpreted as unsigned char) in lhs is less than the corresponding byte in rhs.

0 if all count bytes of lhs and rhs are equal.

Positive value if the first differing byte in lhs is greater than the corresponding byte in rhs.

[edit] Notes

This function reads object representations, not the object values, and is typically meaningful for only trivially-copyable objects that have no padding. For example, memcmp() between two objects of type std::string or std::vector will not compare their contents, memcmp() between two objects of type struct { char c; int n; } will compare the padding bytes whose values may differ when the values of c and n are the same, and even if there were no padding bytes, the int would be compared without taking into account endianness.

[edit] Example

#include <cstring>
#include <iostream>
 
void demo(const char* lhs, const char* rhs, std::size_t sz)
{
    std::cout << std::string(lhs, sz);
    const int rc = std::memcmp(lhs, rhs, sz);
    if (rc < 0)
        std::cout << " precedes ";
    else if (rc > 0)
        std::cout << " follows ";
    else
        std::cout << " compares equal to ";
    std::cout << std::string(rhs, sz) << " in lexicographical order\n";
}
 
int main()
{
    char a1[] = {'a', 'b', 'c'};
    char a2[sizeof a1] = {'a', 'b', 'd'};
 
    demo(a1, a2, sizeof a1);
    demo(a2, a1, sizeof a1);
    demo(a1, a1, sizeof a1);
}

Output:

abc precedes abd in lexicographical order
abd follows abc in lexicographical order
abc compares equal to abc in lexicographical order

[edit] See also

compares two strings
(function) [edit]
compares a certain number of characters from two strings
(function) [edit]
C documentation for memcmp