strcmp() is enough for most string comparisons, but when dealing with unicode characters, sometimes there are certain nuances that make byte-to-byte string comparison incorrect.
For instance, if you are comparing two strings in Spanish language, they can contain accentuated characters like á, é, í, ó, ú, ü, ñ, ¿, ¡ etc.
By default, such accentuated characters come after the whole alphabet of a,b,c...z. Such comparison would be faulty because the different accents of a should actually come before b.
strcoll() uses the current locale to perform the comparison giving a more accurate result in such cases.
It is defined in <cstring> header file.
strcoll() prototype
int strcoll( const char* lhs, const char* rhs );
The strcoll() function takes two arguments: lhs and rhs. It compares the contents of lhs and rhs based on the current locale of LC_COLLATE category.
strcoll() Parameters
- lhs and rhs: Pointer to the null terminated strings to compare.
strcoll() Return value
The strcoll() function returns a:
- positive value if the first differing character in lhs is greater than the corresponding character in rhs.
- negative value if the first differing character in lhs is less than the corresponding character in rhs.
- 0 if lhs and rhs are equal.
Example: How strcoll() function works?
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
char lhs[] = "Armstrong";
char rhs[] = "Army";
int result;
result = strcoll(lhs,rhs);
cout << "In the current locale ";
if(result > 0)
cout << rhs << " precedes " << lhs << endl;
else if (result < 0)
cout << lhs << " precedes " << rhs << endl;
else
cout << lhs << " and " << rhs << " are same" << endl;
return 0;
}
When you run the program, the output will be:
In the current locale Armstrong precedes Army