引数がいくつあるかを知る方法はありません。ユーザーは不確定な長さのリストを提供できます。
私はCが非常に苦手です。コマンドライン配列から新しい文字列配列に引数を読み取るにはどうすればよいですか?
率直に言って、正直に言うと、個別の文字列の配列を作成する方法すらわかりません。例は非常に役立ちます。
引数がいくつあるかを知る方法はありません。ユーザーは不確定な長さのリストを提供できます。
私はCが非常に苦手です。コマンドライン配列から新しい文字列配列に引数を読み取るにはどうすればよいですか?
率直に言って、正直に言うと、個別の文字列の配列を作成する方法すらわかりません。例は非常に役立ちます。
はいあります。
メイン関数の完全なプロトタイプを見ると、次のようになります。
int main(int argc, char **argv, char **env)
argc:これは引数カウンターであり、ユーザーが指定した引数の数が含まれます(コマンドが、と仮定すると、コマンド名は常に引数0であるためcd
、入力するとargc = 2になります)cd home
argv:これは引数の値であり、引数自体を指すサイズargcの配列です。char*
env:これは、プログラムが呼び出されたときの環境を含むテーブル(argvとして)です(たとえば、シェルを介して、env
コマンドで指定されます)。
物事の配列を作成する例として: 2つの方法が可能です:
まず、固定長配列:
char tab[4]; // declares a variable "tab" which is an array of 4 chars
tab[0] = 'a'; // Sets the first char of tab to be the letter 'a'
次に、可変長配列:
//You cannot do:
//int x = 4;
//char tab[x];
//Because the compiler cannot create arrays with variable sizes this way
//(If you want more info on this, look for heap and stack memory allocations
//You have to do:
int x = 4; //4 for example
char *tab;
tab = malloc(sizeof(*tab) * x); //or malloc(sizeof(char) * x); but I prefer *tab for
//many reasons, mainly because if you ever change the declaration from "char *tab"
//to "anything *tab", you won't have to peer through your code to change every malloc,
//secondly because you always write something = malloc(sizeof(*something) ...); so you
//have a good habit.
配列の使用:
宣言する方法(固定サイズまたは可変サイズ)を選択する場合は、常に同じ方法で配列を使用します。
//Either you refer a specific piece:
tab[x] = y; //with x a number (or a variable containing a value inside your array boundaries; and y a value that can fit inside the type of tab[x] (or a variable of that type)
//Example:
int x = 42;
int tab[4]; // An array of 4 ints
tab[0] = 21; //direct value
tab[1] = x; //from a variable
tab[2] = tab[0]; //read from the array
tab[3] = tab[1] * tab[2]; //calculus...
//OR you can use the fact that array decays to pointers (and if you use a variable-size array, it's already a pointer anyway)
int y = 21;
int *varTab;
varTab = malloc(sizeof(*varTab) * 3); // An array of 3 ints
*varTab = y; //*varTab is equivalent to varTab[0]
varTab[1] = x; //Same as with int tab[4];
*(varTab + 2) = 3; //Equivalent to varTab[2];
//In fact the compiler interprets xxx[yyy] as *(xxx + yyy).
変数にスターを付けることを間接参照と呼びます。これがどのように機能するかわからない場合は、ぜひご覧になることをお勧めします。
これが十分に説明されていることを願っています。それでも質問がある場合はコメントしてください。この回答を編集します。
int main ( int argc, char *argv[] ) {
}
これは、メインエントリ関数を宣言する方法です。
(=プログラム名)argc
の最初の文字列であるプログラム名を含む、ユーザーが入力した引数の数です。argv
argv[0]
argvはすでに文字列の配列であるため、これを使用することをお勧めします。(インデックス0をスキップすることを忘れないでください)
int main(int argc, char *argv[])
それはあなたのプログラムでメインがどのように見えるべきかです。 argc
プログラムに渡される引数の数です。argv
は、プログラムに渡される引数である文字列のリストです。argv[0]はプログラム名です。