3

我需要将字符串与以下方式进行比较。任何人都可以在 C++ 中为我提供一些见解或算法。例如:

 "a5" < "a11"        - because 5 is less than 11
 "6xxx < 007asdf"    - because 6 < 7
 "00042Q < 42s"      - because Q < s alphabetically
 "6   8" < "006 9"   - because 8 < 9
4

4 回答 4

3

我建议你看看算法的strverscmp使用——事实上,这个函数可能会为你完成这项工作。

该函数的作用如下。如果两个字符串相等,则返回0。否则,找到两个字节之间的位置,其属性为在它之前两个字符串相等,而在它之后有一个差异。查找包含(或开始于或结束于)该位置的最大连续数字字符串。如果其中一个或两个为空,则返回strcmp(3) 将返回的内容(字节值的数字排序)。否则,以数字方式比较两个数字字符串,其中具有一个或多个前导零的数字字符串被解释为它们前面有一个小数点(因此,特别是具有更多前导零的数字字符串位于具有较少前导零的数字字符串之前)。因此,排序为 000、00、01、010、09、0、1、9、10。

于 2012-04-18T05:29:13.873 回答
2

您的示例仅显示数字、字母和空格。因此,目前我假设您忽略所有其他符号(有效地将它们视为空格)。您似乎还希望将大写和小写字母视为等效。

似乎您将数字的运行解释为“术语”,将字母的运行解释为“术语”,字母和数字之间的任何转换都等效于空格。单个空格被认为等同于任意数量的空格。

(注意:您明显错过了在以下情况下该怎么做的示例:

"5a" vs "a11"
"a5" vs "11a"

因此,当您面对数字术语与字符串术语的比较时,您必须弄清楚该怎么做。您也没有提到内在平等......例如应该“5 a”==“5a”只是因为“5 a”<“5b”?)

一种明确的方法是将字符串转换std::vector为“术语”,然后比较这些向量(而不是尝试直接比较字符串)。这些术语可以是数字或字符串。这可能会帮助您入门,尤其是 STL 答案:

如何拆分包含字符和数字的字符串值

在一次性比较中,在不使用中介的情况下对字符串本身起作用的更复杂的方法会更快。但是,如果您要反复比较相同的结构,它们可能会更难理解和修改,并且可能会更慢。

解析成结构的一个很好的方面是您可以在过程中对数据进行内在的“清理”。将信息转换为规范形式通常是容忍如此多种输入的程序的目标。

于 2012-04-18T05:06:28.970 回答
1

我假设您希望按以下顺序进行比较:存在 1-9 范围内的数字;数字值;位数; 数字后面的字符串的值。

它在 C 中,但您可以轻松地将其转换为使用 C++ std::string 类。

int isdigit(int c)
{
    return c >= '1' && c <= '9';
}

int ndigits(const char *s)
{
    int i, nd = 0;
    int n = strlen(s);

    for (i = 0; i < n; i++) {
        if (isdigit(s[i]))
            nd++;
    }
    return nd;
}

int compare(const char *s, const char *t)
{
    int sd, td;
    int i, j;

    sd = ndigits(s);
    td = ndigits(t);

    /* presence of digits */
    if (!sd && !td)
        return strcasecmp(s, t);
    else if (!sd)
        return 1;
    else if (!td)
        return -1;

    /* value of digits */
    for (i = 0, j = 0; i < sd && j < td; i++, j++) {
        while (! isdigit(*s))
            s++;
        while (! isdigit(*t))
            t++;

        if (*s != *t)
            return *s - *t;
        s++;
        t++;
    }

    /* number of digits */
    if (i < sd)
        return 1;
    else if (j < td)
        return -1;

    /* value of string after last digit */
    return strcasecmp(s, t);
}
于 2012-04-18T06:32:39.677 回答
-4

试试这个并阅读std::string.compare

#include <iostream>
using namespace std;


int main(){
    std::string fred = "a5";  
    std::string joe = "a11";

    char x;

    if ( fred.compare( joe ) )
    {
        std::cout << "fred is less than joe" << std::endl;
    }
    else
    {
            std::cout << "joe is less than fred" << std::endl;
    }


    cin >> x;
}
于 2012-04-18T04:45:25.797 回答