比较两个字母数字字符串

时间:2012-04-18 04:31:48

标签: c++ data-structures

我需要按照以下方式比较字符串。任何人都可以在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 个答案:

答案 0 :(得分:3)

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

  

此功能的作用如下。如果两个字符串相等,   返回0.否则找到两个字节之间的位置   在它们两个字符串相等之前的属性,而在之后直接   它有区别。找到最大的连续数字字符串   包含(或开始于或结束)此职位。如果一个或   这两个都是空的,然后返回strcmp(3)所具有的内容   返回(字节值的数字排序)。否则,比较两者   数字字符串数字,其中数字字符串有一个或多个   前导零被解释为前面有一个小数点   (因此特别是具有更多前导零的数字字符串   在具有较少前导零的数字字符串之前)。因此,排序是   000,00,001,010,09,0,1,9,10。

答案 1 :(得分:2)

您的示例仅显示数字,字母和空格。所以暂时我假设你忽略了所有其他符号(有效地将它们视为空格)。您似乎也希望将大写和小写字母视为等效字母。

您还可以将数字运行解释为&#34; term&#34;并且字母作为&#34; term&#34;,字母和数字之间的任何过渡等同于空格。单个空格被认为等同于任意数量的空格。

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

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

因此,当您面对数字术语与字符串术语的比较时,您必须弄清楚该怎么做。你也没有提到内在的平等......比如应该&#34; 5 a&#34; ==&#34; 5a&#34;仅仅因为&#34; 5 a&#34; &LT; &#34;图5b&#34;?)

这样做的一个明确方法是将字符串转换为&#34;术语&#34;的std::vector,然后比较这些向量(而不是尝试直接比较字符串)。这些术语可以是数字或字符串。这可能有助于您入门,尤其是STL答案:

how to split a string value that contains characters and numbers

在不进行中介的情况下处理字符串本身的诡计方法在一次性比较中会更快。但是他们可能更难理解和修改,如果你要反复比较相同的结构,可能会更慢。

解析到一个结构的一个很好的方面是你得到一个内在的&#34;清理&#34;这个过程中的数据。将信息转换为canonical form通常是容忍各种输入的程序的目标。

答案 2 :(得分: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);
}

答案 3 :(得分:-3)

试试这个并阅读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;
}