0

char を 1 つずつ比較しようとしています。クラスからの割り当てから strcmp 関数をエミュレートしています。これが私が思いついたものです。残念ながら、すべての文字が最後の文字に到達するまで一致するため、常に 0 になります。最初の文字と停止のみをチェックしていると思います。次の文字に i++ を追加しましたが、うまくいかないと思います。

strComp("abc", "abcd");

int strComp(char a[], char b[]) {
    int i = 0;

    if (strLen(a) == strLen(b)) {
        while (a[i] != NULL && b[i] != NULL) {
            if (a[i] == b[i]) {
                return 0;
            } else if(a[i] > b[i]) {
                return 1;
            } else {
                return -1;
            }
        }
        i++;
    } else if (strLen(a) > strLen(b)) {
        return 1;
    } else {
        return -1;
    }
}
4

5 に答える 5

4

ご了承ください

  • NULLとは異なります'\0'
  • char[]本当に崩壊するchar*
  • C/C++ では、宣言できるものconstはすべて宣言する必要がありますconst
  • このような基本的な関数での使用strlenは非効率的です

これが非常に高速なソリューションです。

inline int compare(char const* const a, char const* const b)
{
    /* Return -1 less than, 0 equal, 1 greater than */
    if (!a[0] && b[0])
        return -1;
    else if (a[0] && !b[0])
        return 1;
    register int i = 0;
    for (; a[i] && b[i]; i++) {
        if (a[i] < b[i])
            return -1;
        if (a[i] > b[i])
            return 1;
    }
    #if 1 /* this addition makes this code work like std::strcmp */
    if (!a[i] && b[i])
        return -1;
    else if (a[i] && !b[i])
        return 1;
    #endif
    return 0;
}

これは、386 アセンブラ ルーチンのプロトタイプとして 20 年以上前にコーディングしたものです。大文字と小文字を区別しない文字列の場合#include <locale>、for ループを比較して変更します。

            .
            .
        for (; a[i] && b[i]; i++) {
            if (std::toupper(a[i]) < std::toupper(b[i]))
                return -1;
            if (std::toupper(a[i]) > std::toupper(b[i]))
                return 1;
        }
于 2013-10-17T06:54:15.197 に答える
3

置く

++i; 

whileループの中で

上の2行だけ...

于 2013-10-17T06:53:11.983 に答える
0

私はあなたのコードについて2つのことを言わなければなりません:

  1. i++はループ内に入る必要がありますが++i、コンパイラによっては を使用する必要がi++あります++i
  2. との長さが等しいので、while (a[i])の代わりにそれで十分です。while (a[i] != NULL && b[i] != NULL)ab
于 2013-10-17T07:18:15.727 に答える
0

それはあなたがあまりにも早く帰ってきたからです。関数で return を実行すると、コントロールは呼び出された場所に戻ります。

この場合、論理エラーである while ループで返されます。ここでケースを取り上げます。最初に a[0] と b[0] を比較し、コードに従って 3 つのケースすべてで返されます。つまりa[0]b[0] 1 を返し、それ以外の場合は 0 を返します... 関数全体を変更する必要があります。必要に応じて関数を編集しますので、お待ちください

int strComp(char a[], char b[]) {
    int i = 0;

    if (strLen(a) == strLen(b)) {
        while (a[i] != NULL && b[i] != NULL) {
            if (a[i] == b[i]) {
                return 0;
            } else if(a[i] > b[i]) {
                return 1;
            } else {
                return -1;
            }
        }
        i++;
    } else if (strLen(a) > strLen(b)) {
        return 1;
    } else {
        return -1;
    }
}

編集コード(PS:試したことがないことを確認してください):

  int strComp(char a[], char b[])
    {
        int i = 0;


            while (a[i]!='\0'&&b[i]!='\0')  
            {

             if(a[i] > b[i])
                {
                    return 1;
                }
                else if (a[i] < b[i])
                {
                    return -1;
                }
                i++;   //place i++ here
            }

       if(a[i]==b[i])
          return 0;  //if string are equal
      if(a[i]=='\0')
          return -1;
      else 
         return 1;
    }
于 2013-10-17T07:38:04.527 に答える