Ваши примеры только показывают цифры, буквы и пробелы. Поэтому на данный момент я предполагаю, что вы игнорируете любой другой символ (эффективно относитесь к ним как к пробелам). Вам также кажется, что нужно рассматривать прописные и строчные буквы как эквивалентные.
Также представляется, что вы интерпретируете пробеги цифр как «термин» и пробежки букв как «термин», причем любой переход между буквой и цифрой эквивалентен пробелу. Единое пространство считается эквивалентным любому числу пространств.
(Примечание: Вы явно не хватает пример того, что делать в таких случаях, как:
"5a" vs "a11"
"a5" vs "11a"
Таким образом, вы должны решить, что делать, когда вы сталкиваетесь сравнение числового термина со строкой Вы также не говорите о неотъемлемых равенствах ... таких как «5 a» == «5a» только потому, что «5 a» < «5b»?)
Одним из ясных способов сделать это будет превратите строки в std::vector
из «терминов», а затем сравните эти векторы (вместо того, чтобы пытаться сравнить строки напрямую). Эти термины будут либо числовыми, либо строковыми. Это может помочь вам начать работу, особенно STL ответа:
how to split a string value that contains characters and numbers
хитрых методы, которые работали на струнах себя без посредника будет быстрее в разовых сравнениях. Но их, вероятно, будет сложнее понять и изменить, и, возможно, медленнее, если вы собираетесь неоднократно сравнивать те же структуры.
Хорошим аспектом анализа в структуре является то, что вы получаете внутреннюю «очистку» данных в процессе. Получение информации в canonical form часто является целью в программах, допускающих такое разнообразие входов.
. Что относительно пробела, которое я пробовал как «5 a» <«5 b» –
@ user765443: Для («5 a», «5 b») у вас есть цифры, val цифр равны, число цифр равно - последняя строка 'return strcmp (s, t);' будет оценена. strcmp сравнивает остатки строк в соответствии с таблицей ASCII. Это означает, что мы сравниваем (0x20 0x61) с (0x20 0x62). Первая строка меньше. –
Обратите внимание, что это * не * обрабатывает случай «a5» «a11» правильно - было немного поспешным, когда я его написал. Вам нужно будет добавить внутренний цикл к значению '/ * цифр * /'. –