C++ string sort like a human being?
Is there any way to do with without writing a mini-parser?
Let someone else do that?
I'm using this implementation: http://www.davekoelle.com/alphanum.html, I've modified it to support wchar_t, too.
It really depends what you mean by "parser." If you want to avoid writing a parser, I would think you should avail yourself of library functions.
- Treat the string as a sequence of subsequences which are uniformly alphabetic, numeric, or "other."
- Get the next alphanumeric sequence of each string using
isalnum
and backtrack-checking for+
or-
if it is a number. Usestrtold
in-place to find the end of a numeric subsequence. - If one is numeric and one is alphabetic, the string with the numeric subsequence comes first.
- If one string has run out of characters, it comes first.
- Use
strcoll
to compare alphabetic subsequences within the current locale. - Use
strtold
to compare numeric subsequences within the current locale. - Repeat until finished with one or both strings.
- Break ties with
strcmp
.
This algorithm has something of a weakness in comparing numeric strings which exceed the precision of long double
.