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 を返します。そうでない場合は、2 バイトの前では両方の文字列が等しく、直後では違いがあるというプロパティを使用して、2 バイト間の位置を見つけます。この位置を含む (またはこの位置で開始または終了する) 最大の連続した数字列を見つけます。これらの 1 つまたは両方が空の場合、strcmp(3) が返すもの (バイト値の数値順) を返します。それ以外の場合は、両方の数字列を数値で比較します。1 つ以上の先行ゼロを持つ数字列は、前に小数点があるかのように解釈されます (そのため、特に先行ゼロが多い数字列は、先行ゼロが少ない数字列よりも前になります)。したがって、順序は 000、00、01、010、09、0、1、9、10 です。

于 2012-04-18T05:29:13.873 に答える
2

あなたの例は、数字、文字、およびスペースのみを示しています。したがって、当面は、他のすべての記号を無視すると仮定します (事実上、それらをスペースとして扱います)。また、大文字と小文字を同等に扱いたいようです。

また、一連の数字を「用語」として解釈し、一連の文字を「用語」として解釈しているようにも見えます。文字と数字の間の遷移はスペースと同等です。1 つのスペースは、任意の数のスペースと同等と見なされます。

(注:次のような場合に何をすべきかの例が著しく欠けています:

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

したがって、数値項と文字列項の比較に直面したときに何をすべきかを考え出さなければなりません。また、本質的な等式についても言及していません...「5 a」<「5b」という理由だけで「5 a」==「5a」にする必要がありますか?)

これを行う明確な方法の 1 つは、文字列をstd::vector「項」に変換してから、これらのベクトルを比較することです (文字列を直接比較しようとするのではなく)。これらの用語は、数値または文字列のいずれかになります。これは、特にSTLの回答を始めるのに役立つかもしれません:

文字と数字を含む文字列値を分割する方法

仲介者を作らずに文字列自体に作用するトリッキーな方法は、1 回限りの比較では高速になります。しかし、同じ構造を繰り返し比較しようとすると、理解したり変更したりするのが難しくなり、遅くなる可能性があります。

構造への構文解析の優れた点は、処理中にデータの固有の「クリーンアップ」が得られることです。このようなさまざまな入力を許容するプログラムでは、多くの場合、情報を正規の形式にすることが目標になります。

于 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 に答える