1

私は次のプログラムを持っており、以下に示すようにコマンドラインで2つの引数を渡します。argcが3になると思っていたのですが、6と表示されます。なぜですか。

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;
void usage();

int main(int argc, char *argv[])
{
    cout << argc << endl;
    if (argc != 3)
            usage();

    string regex = argv[1];
    string searchString = argv[2];

    cout << "regex: " << regex << " . searchString: " << searchString << endl;

    return 0;
}

void usage()
{
    cout << "Usage: ./stringmatch <regex> <searchString>" << endl;
    exit(1);
}

コマンドライン:

[jim@cola c++]$ ./stringmatch [yyyy\d\d\d]* yyyy1234
 6
 Usage: ./stringmatch <regex> <searchString>
4

4 に答える 4

7

シェルはglobパターンを拡張している[yyyy\d\d\d]*ため、実際の引数の数は現在のディレクトリの内容によって異なります。

は、文字と、に[yyyy\d\d\d]一致する文字クラスになり、後続のすべてに一致するため、現在のディレクトリには、またはで始まる4つのファイルがあると思います。それが何に拡張されるかを確認するには、次を使用します。yd*ydecho

$ echo [yyyy\d\d\d]*

意図したとおりに機能させるには、引数を引用します。

$ ./stringmatch '[yyyy\d\d\d]*' yyyy1234
于 2012-12-01T22:11:57.700 に答える
2

[yyyy\d\d\d]*シェルによって、パターンに一致する複数のファイル名に展開されます。3を取得するためにそれを引用します。

于 2012-12-01T22:11:54.043 に答える
2

シェルはコマンドラインを次のように解決します

./stringmatch [yd]* yyyy1234

これにより、yまたはdに加えてyyyy1234で始まるすべてのファイルが得られます。したがって、yとdのいずれかで始まる4つのファイルに加えて、yyyy1234と./stringmatchを使用すると、正確に6になります。

詳細については、ファイル名の拡張とパターンマッチングを参照してください。

2つの引数だけが必要な場合は、最初の引数を一重引用符または二重引用符で引用する必要があります

./stringmatch '[yyyy\d\d\d]*' yyyy1234
于 2012-12-01T22:13:12.057 に答える
1

シェルが引数を拡張しているため、これを防ぐために引数を''でラップします。

于 2012-12-01T22:12:19.780 に答える