2

言い換えれば、すべての区切り記号を含む単一の文字列で、コマンド ライン全体 (またはコマンド ラインの引数部分) をキャプチャする方法はありますか?

私は明示的に argv の要素を連結することを含む解決策を探していません。そのような解決策は、区切り文字または引数のフォーマットについて何かを想定しています。

たとえば、次のプログラムを見てみましょう。

#include <stdio.h>

int main(int argc, char** argv){
    int i;
    for (i = 0; i < argc; i++)
        puts(argv[i]);
}

次のように実行すると:

 Test.exe 1 2

出力が得られます:

 Test.exe
 1
 2

これは問題ではありませんが、次のように実行すると:

Test.exe "1" "2"

そして、まったく同じ出力が得られます。これは問題です。基本的に、コマンドラインとして発行された逐語的な文字列を取得しようとしています。

4

5 に答える 5

3

C には、コマンド ライン (または引数) を単一の文字列として取得し、すべての引用符がそのままの状態で、少なくとも言語標準で定義されていない組み込みメソッドはありません。argv問題の一部は配列の定義であり、その一部はプログラムに引数を渡すにシェルが行うことです(引用符の削除など):

5.1.2.2.1 プログラムの起動
...
— の値がargc0 よりも大きい場合、配列メンバーにはargv[0]プログラムの起動前にホスト環境によって実装定義の値が与えられるargv[argc-1]文字列へのポインターが含まれます。その目的は、ホスト環境の他の場所からプログラムを開始する前に決定された情報をプログラムに提供することです。ホスト環境が大文字と小文字の両方の文字を含む文字列を提供できない場合、実装は文字列が小文字で受け取られるようにする必要があります。

鉱山を強調します。

あなたが望むことをするプラットフォーム固有の拡張機能があるかもしれませんが、私は個人的に知りません.

于 2012-04-17T18:26:46.063 に答える
0

int main (int argc, char** argv)

argc は引数の数、argv はパラメタラーです。それらはスペースで区切られていると思います。

それらを 1 つの文字列にマージしたい場合は、次のように実行できます: (下手な書き方だったらすみません)。

#include <sstream>
#include <string>
// --------
std::stringstream S;
for (int i = 0; i < argc; ++i)
    S << argv[i];

std::string Str = S.str();

マージ時にそれらの間にスペースを追加することもできますが、デバッグ目的を除いて、あまり役に立たないと思います。通常、そのまま使用するか、中に入れるvector<string>のが最も便利な方法です。

ああ、それが純粋な C でなければならないことに気づきませんでした (私はいつもこの間違いを犯します)。その場合はそのままにしておいてください。誰かが C++ で使用する場合に備えて、上記のコードは削除しません。

于 2012-04-17T17:57:47.580 に答える
0

環境プロパティのいずれかを使用できます

Environment.CommandLine
于 2012-04-17T17:59:14.043 に答える
0

Unix -- ここで C は UNIX の起源を示しています -- には、コマンド ラインではなく、引数の概念があります。コマンドラインはシェルによって解析され、引数に分割され、プログラムは引数のみを認識します。

On systems which have a notion of command line, one could pass the command line as the first argument and let the program parse them. Most C implementations don't do that -- at least by default -- they do their own argument splitting from the command line.

Depending on your context you may:

  • accept that the C way is the Unix way and don't try to force something else on it;
  • rebuild a command line (but you'll have to pay attention to quoting);
  • use a system dependant way to get access to the unparsed command line if there is one.

The first is probably the best if you want portability, the last the best if you have to respect conventions different than what your implementation provide for argument splitting.

于 2012-04-17T18:38:13.467 に答える
0

C と C++には、コマンド ラインの概念さえありません。プログラムは引数を のargvパラメータで取得するだけですmain。それがどのように行われるかは、実装次第です。

Windows では、 を呼び出すことができますGetCommandLine。実際には、プログラムは開始前に既にそれを呼び出しています。これは、最初に配列を設定mainするタスクの一部として Windows プログラムが行うことだからです。argv

Unix と Linux では、プログラムが実行を開始する前に、コマンド ラインが解析されて分割されます。execコマンドライン引数は関数ファミリーに渡されます。

コマンドを逐語的に読み取るためのクロスプラットフォームでポータブルな方法が必要な場合は、コマンド ラインではなく、ファイルから読み取ることをお勧めします。コマンド ラインは、コマンド インタープリター (bash や cmd.exe など) からのメッセージの対象となります。

于 2012-04-17T18:43:19.077 に答える