2011-05-27 13 views
0

固定サイズの文字バッファを単純な文字列と比較する低レベルの組み込みシステムです。バッファーは文字列よりもはるかに大きいので、比較演算子が2つが等しくないと言う理由です。これは、文字列をバッファの先頭と比較する簡単な関数を書くように促しました。これは洗練されたソリューションですか?おかげC固定サイズのchar配列と文字列を比較する

int CompareString(const char* string, int strlen) 
{ 
    //first check to see if the length is the same 
    //if there is a null char at string length then 
    //they are equal 
    if(MsgBuffer[strlen] != '\0') 
    { 
     return 0; //they are not equal 
    } 

    strlen = strlen - 1; 

    while(strlen > -1) 
    { 
     if(string[strlen] != MsgBuffer[strlen]) 
     { 
       return 0; //they are equal 
     } 

     strlen = strlen - 1; 
    } 

    return 1; //they are equal 
} 
+1

strncmp()を使用することに間違いがあります。 MsgBufferがグローバルであることを考えると、それは優雅ではありません。 –

+0

ミッチこれは、単一目的の低レベル組み込みシステムです。グローバルは受け入れられます。 – Dave

+0

また、私は非常に小さなスペースの制約の下にあります - string.hをインポートしないでください私に不必要な膨らみの負荷を与えますか? – Dave

答えて

1

ここにあなたが使用できるいくつかのコードがあります。単純に比較文字列とバッファを2つのパラメータとして渡します。このコードは、MISRA-C:2004にも完全に準拠する必要があります。

sint8 gpfunc_strcmp (const uint8* s1, const uint8* s2) 
{ 

    while ((*s1 != '\0') && (*s2 != '\0')) 
    { 
    if (*s1 != *s2) 
    { 
     break; 
    } 
    else 
    { 
     s1++; 
     s2++; 
    } 
    } 

    return (sint8)(*s1 - *s2); 
} 
3

通常は、あなたが最大の長さは固定されたバッファサイズであることをstrncmpを使用しての中に見ることができます。

しかし、特にあなたが組み込み環境で動作していることを前提に、ある程度制限されている可能性があります。各文字列の末尾に異なる数のスペースを持つスペースが埋め込まれた文字列の比較には適していない可能性があります。 - strncmpは、"Hello"{'H','e','l','l','o',' ',' ',' '}のサイズ8です。

そのような場合、私は次のようなものを見ていると思います:

#include <stdio.h> 

int compStr (char *s1, char *s2, size_t sz) { 
    while (sz != 0) { 
     // At end of both strings, equal. 
     if ((*s1 == '\0') && (*s2 == '\0')) break; 

     // Treat spaces at end and end-string the same. 
     if ((*s1 == '\0') && (*s2 == ' ')) { s2++; sz--; continue; } 
     if ((*s1 == ' ') && (*s2 == '\0')) { s1++; sz--; continue; } 

     // Detect difference otherwise. 
     if (*s1 != *s2) return 0; 

     s1++; s2++; sz--; 
    } 
    return 1; 
} 

int main (void) { 
    printf ("%d\n", compStr ("Hello", "Hello", 5)); 
    printf ("%d\n", compStr ("Hello", "Hello  ", 5)); 
    printf ("%d\n", compStr ("Hello  ", "Hello", 5)); 
    printf ("%d\n", compStr ("Hello  ", "Hello ", 5)); 
    printf ("%d\n", compStr ("HelloX", "Hello", 5)); 
    printf ("%d\n", compStr ("HelloX", "HelloY", 5)); 
    printf ("%d\n", compStr ("HelloX", "HelloY", 6)); 
    return 0; 
} 

これは、最大特定のサイズに、末尾のスペースの任意の数の文字列にマッチし、その利点を持っていますいずれかがグローバルな領域であると仮定するのではなく、任意のバッファを渡すことができます。


はさておき、それはあなたがしたいことがあるため、変数名としてstrlenのような標準ライブラリ関数を使用するのは良い考えではありません。ある時点で、標準ライブラリを使用します。

+0

バッファの先頭に文字列が含まれていて、末尾に生データが含まれている可能性があります。その場合、バッファ長のstrncmpは機能しません。 – Lundin

+0

@ Lundin、いいえ、バッファが完全に埋まっていると仮定しています。それ以外の場合は、データがどこで止まってゴミが出るかを知るための方法はありません。 – paxdiablo

+0

文字列はNULLで終了すると仮定しなければならないか、実際にはC言語定義による文字列ではありません。これは私自身の答えがstrcmpを提案してstrncmpを提案しなかった理由です。 – Lundin

0

"比較演算子"? ==などを意味しますか?文字列を比較するためにそれらを使用することはできません。なぜなら、文字列はコンテンツではなく場所を比較するからです。代わりにstrcmpまたはstrncmpを使用する必要があります。

(そして、私は他の人が言ってきたように、あなたの組み込み環境が文字列ライブラリ不便を利用したりすることがあります、あなたの実際の質問への答えは、strncmpはがすでに存在していることから、いや、これは、エレガントな解決策ではないことであると思います。しかし、 。)