2

C++ で strcmp を使用して文字配列を比較していますが、strcmp が発生するたびに次のエラーが発生します: エラー: 'int' から 'const char*' への変換が無効です: エラー: 'int strcmp の引数 2 を初期化しています(const char*, const char*)'

string、string.h、および stdio.h を含めました。これが私のコードです。返信してくれたすべての人に感謝します。

また、一連の if ステートメント以外にバッファをチェックするより良い方法はありますか?


int main(int argc, char* argv[])
{
    unsigned count = 0;
    bool terminate = false;
    char buffer[128];

do {
    // Print prompt and get input
    count++;
    print_prompt(count);
    cin.getline(buffer, 128);

    // check if input was greater than 128, then check for built-in commands
    // and finally execute command
    if (cin.fail()) {
        cerr << "Error: Commands must be no more than 128 characters!" << endl;
    }
    else if ( strcmp(buffer, 'hist') == 0 ) {
        print_Hist();
    }
    else if ( strcmp(buffer, 'curPid') == 0 ) {
        // get curPid
    }
    else if ( strncmp(buffer, 'cd ', 3) == 0 ) {
        // change directory
    }
    else if ( strcmp(buffer, 'quit') == 0 ) {
        terminate = true;
    }
    else {
        //run external command
    }

} while(!terminate);

return 0;

}

4

1 に答える 1

8

比較文字列が正しくありません。それらは"hist"、ではなく、の形式である必要があり'hist'ます。

C ++では、'hist'は単なる文字リテラル(C ++ 0xドラフト(n2914)標準のセクション2.14.3に記載されている)であり、最後の段落に重点を置いています。

文字リテラルは、'x'のように一重引用符で囲まれた1つ以上の文字であり、オプションで、u'y'、U'z'、またはL'x'のように文字u、U、またはLのいずれかが前に付きます。 、 それぞれ。

u、U、またはLで始まらない文字リテラルは、通常の文字リテラルであり、狭文字リテラルとも呼ばれます。

単一のc-charを含む通常の文字リテラルのタイプはcharで、値は実行文字セット内のc-charのエンコードの数値と同じです。

複数のc-charを含む通常の文字リテラルは、複数文字リテラルです。複数文字リテラルには、int型と実装定義値があります。

より良い方法があることに関しては、それはあなたがより良いことを意味することに依存します:-)

1つの可能性は、基本的に構造体の配列である関数テーブルを設定することです。各構造体には、単語と関数ポインターが含まれています。

次に、文字列から単語を抽出し、その配列でルックアップを実行し、一致するものが見つかった場合は関数を呼び出します。次のCプログラムは、関数テーブルの使用方法を示しています。それがより良い解決策であるかどうかについては、私はあなたに任せます(それは適度に高度な技術です)-あなたはあなたが理解していることに固執する方が良いかもしれません。

#include <stdio.h>

typedef struct {         // This type has the word and function pointer
    char *word;          // to call for that word. Major limitation is
    void (*fn)(void);    // that all functions must have the same
} tCmd;                  // signature.

// These are the utility functions and the function table itself.

void hello (void) { printf ("Hi there\n"); }
void goodbye (void) { printf ("Bye for now\n"); }

tCmd cmd[] = {{"hello",&hello},{"goodbye",&goodbye}};

// Demo program, showing how it's done.

int main (int argc, char *argv[]) {
    int i, j;

    // Process each argument.

    for (i = 1; i < argc; i++) {
        //Check against each word in function table.

        for (j = 0; j < sizeof(cmd)/sizeof(*cmd); j++) {
            // If found, execute function and break from inner loop.

            if (strcmp (argv[i],cmd[j].word) == 0) {
                (cmd[j].fn)();
                break;
            }
        }

        // Check to make sure we broke out of loop, otherwise not a avlid word.

        if (j == sizeof(cmd)/sizeof(*cmd)) {
            printf ("Bad word: '%s'\n", argv[i]);
        }
    }

    return 0;
}

で実行する場合:

pax> ./qq.exe hello goodbye hello hello goodbye hello bork

次の出力が得られます。

Hi there
Bye for now
Hi there
Hi there
Bye for now
Hi there
Bad word: 'bork'
于 2009-10-28T04:06:33.163 に答える