2

K&Rの本には、次のような質問があります。

呼び出された名前に応じて、大文字を小文字に、またはその逆に変換するプログラムを作成しますか?

与えられた解決策では、プログラムが という名前で呼び出されると、プログラムは にlower変換lowerされupperます。ソリューション プログラムでは、Linux ではargv[0]と比較されますが、そうではありません。"lower"argv[0]"./lower""lower"

誰かがそれを明確にしてもらえますか?

4

2 に答える 2

3

Shellはどのようにプログラムを実行しますか?(以下の非常に簡単な説明)

shell()
{
  loader("Path name/Filename of your program", argv[0], argv[1]...for your program);
}

つまり、ローダーへのこれらすべての引数はシェルによって作成され、次にローダーが呼び出され、デフォルトでargv[0]はプログラムのパス名/ファイル名と同じになります。

./a.out ..と言うと、プログラムの絶対パス名は./a.outです(現在のディレクトリのファイルa.out)

./を省略できますか?環境変数PATHにが含まれている場合、答えは「はい」です。そのコンポーネントの1つとして、最初のコンポーネントを言います。

シェルプロンプトでecho$PATHと入力すると、PATH変数の内容が表示される場合があります(A:パスの個別のリストが表示されます)。

もしも 。シェルプロンプトにexportPATH=。:$ PATHと入力して、追加できます。

この後、a.outと入力して現在のディレクトリからコードを実行でき、。/a.outと入力する必要はありません。

なぜargv[0]が実行中のファイルの名前になるのか、これは明らかだと思います。

ここで、ファイル名ではなく、argv [0]に別の名前を付けることができますか?

答えは「はい」です。次に、ローダーを自分で呼び出す必要があります。つまり、シェルのように動作する小さなコードを記述します。

インターネット/マニュアルページでexecveファミリーの関数を参照できます。これは、実際にはここで参照されているローダーです。

于 2012-07-03T18:27:34.977 に答える
3

次のテスト コードを検討してください。

#include <stdio.h>
int main(int argc, char** argv) {
  printf("ARGV[0] = %s\n", argv[0]);
}

「test_argv」としてコンパイルして実行すると、プログラムを実行するために入力したものが得られます。

% ./test_argv
ARGV[0] = ./test_argv
% test_argv
ARGV[0] = test_argv
% /tmp/test_argv
ARGV[0] = /tmp/test_argv

したがって、たとえば、正規表現に対して、または部分文字列に対して文字列をテストする必要があります。

于 2012-07-03T17:23:14.700 に答える