0

たとえば、ユーザーがコマンドラインに入力した場合

"hello" test*in に一致

これは、「test」という名前のすべての .in タイプのファイルで「the」を見つけることを意味します。

bool containMany=false;
int i;
for(i= 0; arguments[i]; i++){

    printf("ARGUMENTS  %s\n",arguments[i]);
    if(strstr(arguments[i],"*")){
        containMany=true;
        break;
    }
}

しかし、それは機能しません。引数は次のとおりです。

ARGUMENT マッチ

引数こんにちは

引数 test0.in

ARGUMENT test1.in

引数 test2.in

では、ユーザーが「*」と入力したときに、containMany を true にするにはどうすればよいでしょうか。

4

2 に答える 2

2

これは、シェルが glob スタイルの置換を自動的に行うためです。シェルにそれをさせたくない場合は、入力引数を一重引用符で囲むか、バックスラッシュを使用してください。

作業ディレクトリにファイル A と B がある場合、次の式:

test *

に置き換えられます

test A B

テストが実行される前。

一方、次のように実行した場合:

test '*'

またはこのように:

test \*

その場合、シェルの置換は行われず、プログラムは実際にスターを認識します。

于 2014-02-09T23:08:14.667 に答える
0

伝統的に、シェルはコマンド ラインでワイルドカード展開を実行します。これは、Unix スタイルのプラットフォームで実行される方法です。拡張が必要な​​い場合、ユーザーは通常、ワイルドカード文字を含む引数を引用符で囲むか、ワイルドカード文字をエスケープする必要があります。

Windows では、command.com/cmd.exeシェルはファイル名の展開を実行しません。でも:

  • MinGW トゥーチェーンのランタイム、ファイル名のワイルドカードの展開を実行します。この動作を無効にするには、.c ファイルの 1 つにCRT_noglob.oゼロで初期化されたグローバル変数をリンクまたは追加して、ランタイムのグロブ展開を無効にします。int _CRT_glob = 0;
  • MSVC にはオブジェクト ファイルが含まれておりsetargv.obj、必要に応じてランタイムがコマンド ライン ファイル名のワイルドカードを展開します。
于 2014-02-09T23:27:29.857 に答える