#include <stdio.h>
int main(int n){
int n;
printf("%d/n",n);
return 0;
}
main の引数がどのように機能するかを知り、このコードのどこが間違っているかについて提案を求めます。
main
関数プロトタイプは、次のいずれかになります。
int main();
int main(int argc, char *argv[]); (*) Check my comment for this one.
int main(int argc, char **argv);
最後の 2 つのプロトタイプを調べると、2 つの引数があります。1 つ目はプログラムに渡される引数の数で、2 つ目は引数のリストです。最初の引数 ( argv[0]
) は常にプログラム名用に予約されています。
したがって、次のようなことができます。
int main(int argc, char** argv)
{
int n = 0;
if(argc > 1)
{
// Paramenters are sent as strings, so you need to cast it to the int
char *end;
n = strtol(argv[1], &end, 10);
if (*end)
{
printf("Please pass the number for the argument!");
return 0;
}
printf("%d\n", n);
}
return 0;
}
これで、その引数をプログラムに渡すことができ ( ./program_name 15
)、出力されるはずです。
注: atoi
ここではデモンストレーションのみを目的としています。
標準からの引用:
プログラムの起動時に呼び出される関数の名前は
main
です。実装は、この関数のプロトタイプを宣言していません。これは、戻り値の型が int で、パラメーターなしで定義されます。
int main(void) { /* ... */ }
または 2 つのパラメーター (ここでは argc および argv と呼ばれますが、宣言されている関数に対してローカルであるため、任意の名前を使用できます):
int main(int argc, char *argv[]) { /* ... */ }
または同等のもの;) または他の実装定義の方法で。
それらが宣言されている場合、メイン関数へのパラメーターは次の制約に従う必要があります。
言語標準main
に従って、次のいずれかの形式を取ります。
int main( void )
また
int main( int argc, char **argv ) // or char *argv[]
2 番目の形式でargc
は、 に渡されるコマンドライン引数の数が含まれますmain
。一方argv
、 は引数自体を含む文字列のベクトルです。最初の引数 ( argv[0]
) は、プログラムを呼び出すために使用されるコマンドであるため、argc
常に少なくとも 1 1です。
実装では、追加の署名を自由に定義main
できます。コンパイラのドキュメントを確認してください。
手短な例: コマンド ラインから 2 つの整数を取得し、それらを追加して、結果を出力します (C99 を想定)。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int convert( char *arg, int *val )
{
int result = 1;
char *chk;
int x = strtol( arg, &chk, 10 );
if ( !isspace( *chk ) && *chk != 0 )
{
result = 0;
fprintf( stderr, "%s is not a valid integer!\n", arg );
return 0;
}
*val = x;
return 1;
}
int main( int argc, char **argv )
{
if ( argc < 3 )
{
fprintf( stderr, "USAGE: %s x y\n", argv[0] );
exit( 0 );
}
int x, y;
if ( convert( argv[1], &x) && convert( argv[2], &y ))
{
printf( "%d\n", x + y );
}
return 0;
}
IE のコードの書式設定を壊したのは誰?!
引数を操作するには、次の 2 つのパラメーターが必要です。
#include <stdio.h>
int main (int argc, char *argv[])
{
//Do someting with argv
return 0;
}
argv は、null で終了し、引数を含む文字列の配列です (最初の引数は実行可能ファイルの名前です)。
argc は引数の数 (配列 argv の長さ) です。
コードは次のように機能します。
#include <stdio.h>
int main(int argc, char *argv[]){
if(argc > 1)
printf("%s\n",argv[1]);
else
printf("argument missing.\n");
return 0;
}
あなたの主な機能を置き換える必要があります:
int main(int argc, char* argv[]){
for(int i = 0; i < argc; i++){
printf("%s\n",argv[i]);
}
return 0;
}
次に、コンソールからプログラムを呼び出すとき
./foo 1 2 3
次の出力が得られます。
foo
1
2
3
引数がmain
機能する方法は次のとおりです。
int main(int argc, char ** argv) {
// your code
}
このファイルをバイナリにコンパイルしyourbin
、それを呼び出して、シェルで実行すると、次のようになります。
./yourbin arg1 arg2
の値はargc
渡された引数の数で、この場合は 2 で、argv
C 文字列の配列へのポインタです。この場合は"./yourbin", "arg1", "arg2"
したがって、整数n
はコマンドラインから渡された引数の数になります。
この場合、何もしていないので、引数は必要ありません。ただし、これと同様のことを行うために必要になる場合があります。int main(int)
C によって提供されるオーバーロードされたメイン メソッドの 1 つでないため、コードはコンパイルされません。
#include <stdio.h>
int anotherMethod(int a);
int main(){
int n = anotherMethod(5);
printf("%d/n",n);
return 0;
}
int anotherMethod(int a){
a = a + 5;
return a;
}
ただし、引数を main に渡して、コマンド ライン引数で使用できます。
Cのスコープについて少し読むことをお勧めします
What IBM have say aboutとこの C チュートリアルに関するリンクを次に示します。
この場合、プログラムで n 変数を使用する場合は、最初のコメントを確認できます