2011-01-06 19 views
0

私はちょうどC言語を学び始めましたが、かなり遅いです...私は、整数の引数をとり、2倍の値を返すプログラムを書こうとしていました(別名2で、その値をprintfします)。基本的なCプログラミングの質問

私は意図的にscanf関数を使用したくありませんでした。ここでは、私はこれまで、どのようなプログラムは、私は、インデックスの整数を供給したい実行されたときしたがって、基本的...

#include <stdio.h> 

int main(int index) 
{ 
    if (!(index)) { 
     printf("No index given"); 
     return 1; 
    } 
    a = index*2; 
    printf("Mult by 2 %d",a); 

    return 0; 

} 

をコンパイルされていない持っているものです。だから、cygwinでは、私は./a 10のようなものを書いて、10はインデックス変数に格納されます。 また、 "No index given"を返し、インデックス値が指定されていない場合は終了するようプログラムする必要があります。

誰かが間違っていることに気をつけますか?

EDIT:

このコードはコンパイル時に1つのエラーを返し、@Jamesによって助けに基づいています。

#include <stdio.h> 

int main(int 1, char index) 
{ 
    int index, a; 
    if (!(index)) { 
     printf("No index given"); 
     return 1; 
    } 
    a = index*2; 
    printf("Mult by 2 %d",a); 

    return 0; 

} 

EDIT 2:値がちょうど取られ、エコーバックされたシンプルなプログラムを検討します(下に示すように)

#include <stdio.h> 

int main(int argc, char* argv[]) 
{ 
    int index; 
    index = argv[1]; 

    printf("Index is %d, ", index); 
    /*if (!(index)) { 
     printf("No index given"); 
     return 1; 
    } 
    a = index*2; 
    printf("Mult by 2 %d",a);*/ 

    return 0; 

} 

このプログラムはコンパイルできません。ああ。

編集3:これは最終的にコンパイルして動作するコードです。皆さんありがとう!

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char* argv[]) 
{ 
    if (argc <= 1) 
    { 
     printf("No index given"); 
     return 1; 
    } 
    int i; 
     i = atoi(argv[1]); // convert string in argv[1] to integer 
    int a; 
     a = i*2; 
    printf("Mult by 2: %d",a); 
    return 0; 
} 

ありがとう! アミット

+0

Jamesがヒントしているように、argsがソートされると、引数は文字列 "10"であることがわかります。したがって、これをさらにintに変換する必要があります。 –

+1

@Amit: 'int 1'は無効です。各パラメータは、関数内の変数です。 '1'は変数ではなく、値です。あなたが[良い初心者Cの本](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)を持っていることを確認してください。 –

+1

問題は、 '1'はパラメータの名前にすることができず、依然として正しい署名がないことです。コードのその行に 'int main(int argc、char * argv [])'と入力してください。 –

答えて

7

main機能のための2つだけの保証ツー作業のプロトタイプがあります:1は引数(int main(void))を取らない、他は2つの引数を取り、次のようになります。

int main(int argc, char* argv[]) 

argcは数ありますプログラムに渡される引数の数を返します。argvは、プログラムに渡される引数を含む配列です。あなたは(ユーザーに入力を求めない)プログラムを実行するときに引数を渡したい場合は

  • main取る引数のフォームを使用する

    は、あなたが作るために、

  • チェックが必要になります確かargc
  • 、(argv[0]はプログラム名である、またはあるべき)1より大きいatoiを避ける(strtolsscanfを使用して、整数にその文字列表現からargv[1]を変換、または他のいくつかのライブラリ関数:使用可能なエラー報告を提供しない)、
  • その整数を使用します。 argcが自動的に引数配列argvの引数の数が割り当てられint argc、およびchar **argv、:
+0

があります。「int main(int 1、char * argv [index])」のようなものが必要でしょうか? – Amit

+2

@Amit:あなたは[初心者のCの本](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)を入手したいと思うでしょう。 –

+0

ええ、大丈夫。コンパイル時に1エラーを返す編集済みのコードを投稿しました – Amit

1

あなたはおそらく知っているように、メイン()が「特別」0または二つの引数のいずれかを期待する関数、です。したがって、main()に渡す引数は、argvに格納され、引数にアクセスする必要があります。

このlinkが役立ちます。

0

ここでは、コマンドライン引数を持つMainに適切なプロトタイプを使用してコードを修正しています。

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char* argv[]) 
{ 
    if (argc <= 1) 
    { 
     printf("No index given"); 
     return 1; 
    } 
    int i = atoi(argv[1]); // convert string in argv[1] to integer 
    int a = i*2; 
    printf("Mult by 2 %d",a); 
    return 0; 
} 
+1

'argv [0]'は実行可能ファイルの名前で、最初の引数ではありません(そして、 'atoi()'のためにstdlib.hが必要です) – geoffspear

+0

oops、thanks :) – Derrick

+1

'atoi () 'は' strtol() 'のために非難されました – SiegeX

1

あなたがプログラムに渡す引数はテキストなので、mainはそれらを文字列として受け取ります。これは、コマンドライン引数を空白で分割し、文字列の配列として、それがあなたに与えるパラメータの数を示す数字とともに渡します。プログラムには少なくとも1つの引数があります。プログラムの実行ファイルの名前(この場合は"a")です。この文字列は常にargv [0]にあります。

その他の回答が記載されているとおり、メインの正しい署名はint main(int argc, char* argv[])です。 ./a 10を実行すると、argcは2になり、argv [1]は文字列"10"になります。 int i = atoi(argv[1]);またはint i; sscanf(argv[1], "%d", &i);のようなものを使用して、この文字列を整数に変換して2を掛ける必要があります。