1
#include <iostream>
#include <cstdlib>
#include <sstream>
#include <fstream>
using namespace std;

    int main(int argc, char* argv[]) 
    {
    cout << argv[1] << endl;
    if (argv[1]=="-r") cout << "success\n";
    }

「成功」は印刷されません。私が走ったとき:$ ./hearts -r出てくるのは:

-r

それは私をすっごく混乱させます

4

6 に答える 6

3

私は先に進んで、あなたが望まないことをあなたに言うつもりですstrcmp。コマンドライン引数を処理するC++の方法はstd::string、できるだけ早くそれらをsに変換することです。

int main(int argc, const char* argv[])
{
  // Make a vector of all command-line arguments
  std::vector<std::string> args(argv, argv+argc);
  // Now we can use std::string's operator==
  if (args.size() > 1 && args[1] == "-r") {
    std::cout << "Success" << std::endl;
  }
  return 0;
}

std::string2つのを==演算子で比較できます。の場合args[1] == "-r"const char[]文字列リテラルはstd::string比較のためにに変換されます。あなたのコードでは、argv[1]=="-r"等しくない2つの独立したポインターを比較します-それはCスタイルの文字列の内容を比較しません。

于 2012-11-24T19:54:01.360 に答える
2

==これは、2つのポインターを使用しているためです。同じデータを指しているかどうかではなく、ポインタが等しいかどうかをチェックします。

2つのC文字列を比較するには、strcmp次のように使用します。

if (strcmp(argv[1], "-r") == 0)
于 2012-11-24T19:44:17.217 に答える
1

strcmpおそらく2つの文字列を比較したいと思うでしょう。真であるためには、2つの文字列が同じメモリ位置を参照する必要があります。これは、コンパイル時定数の==ように発生することはありません。"-r"

于 2012-11-24T19:44:09.940 に答える
1

使用する必要がstrcmp()あり、期待どおりに機能します。使用するときは==ポインタを比較しますが、同じにすることはできません。

于 2012-11-24T19:44:19.093 に答える
1

次を使用してみてください。

if (strcmp(argv[1],"-r")==0) cout << "success\n";

引数を文字列リテラルと比較します。

于 2012-11-24T19:44:20.113 に答える
1

Cでは、文字列は文字配列(文字のシーケンスへのポインタ)です。あなたのコードでは、等式演算子は、まったく異なる2つのポインター値を比較するだけです。strcmp関数を使用するか、stringクラスを使用する必要があります。

#include <iostream>
#include <cstdlib>
#include <sstream>
#include <fstream>
#include <cstring> // <-- here

using namespace std;

int main(int argc, char* argv[]) 
{
    cout << argv[1] << endl;
    if (strcmp(argv[1], "-r") == 0) // <-- and here
        cout << "success\n";
}

また

#include <iostream>
#include <cstdlib>
#include <sstream>
#include <fstream>
#include <string> // <-- here

using namespace std;

int main(int argc, char* argv[]) 
{
    cout << argv[1] << endl;
    if (string(argv[1]) == "-r") // <-- and here
        cout << "success\n";
}
于 2012-11-24T19:51:18.157 に答える