1

重複の可能性:
C 文字列 — 2 つの文字列が等しいかどうかを比較するための等値演算子 == の使用

ここで基本的な質問。このプログラムを g++ でコンパイルし、単一の -r 引数 (./a.out -r) で実行していますが、以下の指定された cout ステートメントを出力しません。このコードに何か問題がありますか?

#include <string>
using namespace std;

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

    if (argv[1] == "-r" ) {
        cout << "First arg is -r" << endl;
    }

    return 0;
}  
4

4 に答える 4

6

を使用して文字列リテラルを比較することはできません。これは、ポインター(つまり、この場合は常に異なるメモリ アドレス) を==比較するためです。

代わりにオブジェクトを使用strcmpまたは比較します。std::string

if (strcmp(argv[1], "-r") == 0) { ... }

また

if (std::string(argv[1]) == "-r") { ... }
于 2012-11-27T10:06:49.043 に答える
1

コードの間違いの1つは、配列の値を比較するのではなく、char配列のアドレスを比較していることです。人々が言っ​​ているように、あなたはそれCを使用する方法でそれを行うことができます(バッファオーバーランを避けるためstrcmpに使用する方が安全ですが)。strncmp

ただし、std::stringC++で使用する方が簡単です。

argsを文字列のベクトルにコピーします。

#include <vector>
#include <string>

int main(int argc, char* argv[])
{
    vector<string> args(argv, argv+argc);
    ...
于 2012-11-27T10:26:39.813 に答える
1

文字列リテラルを==と比較することはできません。strcmpを使用します。

(また、argcが少なくとも2であることを確認することを忘れないでください)。

于 2012-11-27T10:09:36.290 に答える
0

通常、次の行に沿って何かを行います。

while (--argc && **++argv=='-')
{
   char *p;
    p=*argv+1;
    switch(tolower(*p))
    {
        case 'r':                                       
            break;

    }
}

基本的に、いくつかの引数が残っている間に、「-」文字があることを確認してから、次の文字に切り替えて修飾子 (「r」、または「a」など) を確認します。

于 2012-11-27T10:12:25.657 に答える