-3
#include <stdio.h>

int main(int n){

int n;

printf("%d/n",n);

return 0;

}

main の引数がどのように機能するかを知り、このコードのどこが間違っているかについて提案を求めます。

4

7 に答える 7

3

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[]) { /* ... */ }

または同等のもの;) または他の実装定義の方法で。

それらが宣言されている場合、メイン関数へのパラメーターは次の制約に従う必要があります。

  1. argc の値は非負でなければなりません。
  2. argv[argc] は null ポインターでなければなりません。
  3. argc の値が 0 より大きい場合、配列メンバー argv[0] から argv[argc-1] までは、文字列へのポインターを含みます。文字列には、プログラムの起動前にホスト環境によって実装定義の値が与えられます。その目的は、ホスト環境の他の場所からプログラムを開始する前に決定された情報をプログラムに提供することです。ホスト環境が大文字と小文字の両方の文字を含む文字列を提供できない場合、実装では、文字列が小文字で受信されるようにする必要があります。
  4. argc の値が 0 より大きい場合、argv[0] が指す文字列はプログラム名を表します。プログラム名がホスト環境から利用できない場合、argv[0][0] はヌル文字になります。argc の値が 1 より大きい場合、argv[1] から argv[argc-1] が指す文字列はプログラム パラメータを表します。
  5. パラメータargcとargv、およびargv配列が指す文字列は、プログラムによって変更可能であり、プログラムの起動とプログラムの終了の間で最後に保存された値を保持します。
于 2013-09-13T18:24:24.173 に答える
2

言語標準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 のコードの書式設定を壊したのは誰?!


1. これは、ホストされた実装と呼ばれるものに当てはまります。基本的に、オペレーティング システムで実行されているものすべてです。通常は組み込みシステムである独立した実装もあり、プログラムのエントリ ポイントを自由に定義できます。

于 2013-09-13T18:41:50.553 に答える
1

引数を操作するには、次の 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;
}
于 2013-09-13T18:24:23.577 に答える
1

あなたの主な機能を置き換える必要があります:

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
于 2013-09-13T18:27:11.903 に答える
1

引数がmain機能する方法は次のとおりです。

int main(int argc, char ** argv) {
  // your code
}

このファイルをバイナリにコンパイルしyourbin、それを呼び出して、シェルで実行すると、次のようになります。

./yourbin arg1 arg2

の値はargc渡された引数の数で、この場合は 2 で、argvC 文字列の配列へのポインタです。この場合は"./yourbin", "arg1", "arg2"

したがって、整数nはコマンドラインから渡された引数の数になります。

于 2013-09-13T18:28:37.460 に答える
0

この場合、何もしていないので、引数は必要ありません。ただし、これと同様のことを行うために必要になる場合があります。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 に渡して、コマンド ライン引数で使用できます。

于 2013-09-13T18:25:50.553 に答える
0

Cのスコープについて少し読むことをお勧めします

What IBM have say aboutとこの C チュートリアルに関するリンクを次に示します。

この場合、プログラムで n 変数を使用する場合は、最初のコメントを確認できます

于 2013-09-13T18:40:30.197 に答える