0

私のプログラミングクラスでは、現在、プログラムに引数を入れる必要があるプロジェクトがあります。次に、引数の 1 つをチェックして、どの値がプログラムに渡されたかを確認し、プログラムが従うべき適切な動作を選択できるようにする必要があります。以前の宿題で、次のコードを使用して、cstring ライブラリに含まれている strcmp 関数を使用してこれを行いました。

int main(int argc, char *argv[]) {
   if (strcmp(argv[1], "yes") == 0) {
      // do this code
   } else if (strcmp(argv[1], "no") == 0) {
      // do this code
   }
}

ただし、何らかの理由で、このプロジェクトで cstring ライブラリを使用することは許可されていません。他にどうすればこれを行うことができますか?

4

6 に答える 6

5

これを試して:

if (argv[1] == std::string("yes")) { stuff }

演習の目的が文字列の比較がどのように機能するかを教えることである場合は、他の回答が示唆するようにforループを実装します。ただし、C ++では、使用することは想定されていませんstrcmp。理由により、文字列クラスがあります。

于 2009-11-24T18:58:29.893 に答える
2

独自のmy_string_comp関数を作成します。

// return 0 on success, -1 on failure
int my_string_comp(char* a, char *b) {
  if(a && b) { // check for non null pointers
    while(*a != '\0' && *b != '\0' && *a == *b) { a++; b++; }
    if(*a == '\0' && *b == '\0') { return 0; }
  }  
  return -1;
}

この関数はブール出力をstrcmp返しますが、2 つの入力文字列の辞書式順序に対応する値を返すことに注意してください。

于 2009-11-24T19:08:20.887 に答える
1

独自のstrcmp関数を作成する

于 2009-11-24T18:58:55.697 に答える
1

手動の for ループを使用して、文字ごとに比較することで、いつでも文字列を比較できます。終了条件は、NULL 文字に遭遇したとき (C では文字列が null で終了するため)、または最初の文字列に 2 番目の文字列の対応する文字と等しくない文字に遭遇したときです。

const char* s1 = "abcdefg";
const char* s2 = "abcdefg";

const char* p1 = s1;
const char* p2 = s2;

int same = 0;
for (; (same = (*p1 == *p2)) && *p1 != '\0'; ++p1, ++p2);

if (same) printf("The strings are equal\n");
else printf("The strings are NOT equal\n");

これにより、文字ごとの比較が可能になります。ただし、これは、ある文字列がアルファベット順で他の文字列よりも「少ない」かどうかも示す辞書編集比較を行うstrcmpという意味で異なることに注意してください。strcmpしかし、等値比較だけが必要なようです。これは、文字列が同一であるかどうかだけを教えてくれます。

于 2009-11-24T18:56:08.293 に答える
0

C++コマンドライン引数処理用のBoost.Programオプションを強くお勧めします。このようなものにはやり過ぎかもしれませんが、少し複雑な場合は、Boost.Programオプションライブラリはコードが少なく、一度記述すれば理解しやすく、構成ファイルや環境変数から引数を取るなどの凝ったことを行うことができます。またはコマンドラインを渡すと、ほとんど作業がありません。

次のような(テストされていない)何かがあなたのために働くはずです:

namespace po = boost::program_options;

int main() {
  po::options_description desc("Allowed options");
  desc.add_options()
    ("help", "produce help message")
    ("yes",  "get down")
    ("no",   "get funky")
  ;

  po:variables_map vm;
  po::store(po::parse_command_line(argc, argv, desc), vm);
  po::notify(vm);

  if (vm.count("yes")) {
    // get down
  } else if (vm.count("no")) {
    // get funky
  }
}

チュートリアルページには、他の多くの例が示されています。これは、追加の、実質的により複雑なコマンドライン引数を追加するのはほとんど作業がないことを示しています。

ブーストはデフォルトではC++に含まれていませんが、通常は追加するのはそれほど難しくありません。Boostは、すべてのC++プログラマーが知っておく必要のあるライブラリのセットの1つです。ただし、まだC ++を学習している場合は、これはやり過ぎかもしれないことに注意してください。

于 2009-11-25T03:45:24.387 に答える
0

入力文字列をハッシュして、その数値に基づいて切り替えることができます。この場合、値はシンボリック定数のハッシュ値を使用します。「文字列」から「ハッシュ」へのマッピングを使用してヘッダー ファイルを生成する外部スクリプトを作成できます。

于 2009-11-24T19:12:03.987 に答える