0

特定の状況では、strcmp を使用するのではなく、文字を直接比較して文字列を比較する方が、プロセッサへの負担が少ないのではないかと考えています。

いくつかの背景情報については、処理能力があまりない組み込みシステムで C でコーディングしています。着信文字列を読み取り、着信文字列が何であるかに応じて特定のタスクを実行する必要があります。

着信文字列が"BANANASingorethispartAPPLESignorethisalsoORANGES". BANANASAPPLES、およびORANGESが正確な位置に存在することを確認したいと思います。私のコードはこれを行います:

input = "BANANASingorethispartAPPLESignorethisalsoORANGES";
char compare[100];            //array to hold input to be compared
strncopy(compare,input,7);    //copy "BANANAS" to compare
compare[7] = "\0";            //terminate "BANANAS"
if (strcmp(compare, "BANANAS") == 0){
    strncopy(compare,input[21],6); //copy "APPLES" to compare
    compare[6] = "\0";             //terminate "APPLES"
    if(strcmp(compare,"APPLES")==0){
        //repeat for "ORANGES"
    }
}

または、文字を直接比較できます。

input = "BANANASingorethispartAPPLESignorethisalsoORANGES";
if(input[0]=='B' && input[1]=='A' && input[2]=='N' && input[3]=='A' && input[4]=='N' && input[5]=='A' && input[6]=='S'){
    if(input[21]=='A' && input[22]=="P"  <snipped> ){
        if(input[30]=='O' <snipped> ){
            //input string matches my condition!
        }
    }
}   

strncopy+strcmp を使用する方がエレガントですが、パフォーマンス上の理由から、文字を直接比較する方が速いでしょうか?

4

2 に答える 2

2

あなたの場合、memcmp()データのコピーを避けるために、より適切に使用する必要があります。

input = "BANANASingorethispartAPPLESignorethisalsoORANGES";
if (memcmp(input, "BANANAS",    7) == 0  &&
    memcmp(input+21, "APPLES",  6 ) == 0 &&
    memcmp(input+40, "ORANGES", 8 ) == 0   )
{
    // everything matches ...
}

の少なくとも一部の実装はmemcmp()、char ごとに比較するよりも高速です。

于 2013-06-26T14:24:47.050 に答える
2

文字を直接比較することは、非常に卑劣で壊れやすいコードです。コンパイラとアーキテクチャによっては、最適化が難しくなる場合もあります。

一方、あなたのコピーは無駄です - それは何の役にも立ちません。

文字列が少なくとも十分な長さ(または正確に正しい長さですが、短すぎない方法)であること、およびstrncmp(またはmemcmp)所定の位置にあることを確認してください。

#define COMPARE(IN, OFF, SUB) memcmp(IN+OFF, SUB, sizeof(SUB)-1)

input = "BANANASingorethispartAPPLESignorethisalsoORANGES";

if (COMPARE(input,  0, "BANANAS") == 0 &&
    COMPARE(input, 21, "APPLES" ) == 0 &&
    COMPARE(input, 40, "ORANGES") == 0) )
{
于 2013-06-26T14:22:07.250 に答える