0
#include<stdio.h>

int main(int number, char arg[])
{
    int i;

    printf("%d\n",number);

    for(i=0;i<7;i++)
        printf("%c",arg[i]);
    printf("\n");   

    return 0;
}

ubuntu ターミナルで実行し、「./a.out」と入力して実行しています。出力が「./a.out」になると予想していましたが、代わりにガベージ値が表示されています。理由を説明してください。

4

4 に答える 4

2

あなたの署名main()は間違っています:

int main(int number, char arg[])

次のようにする必要があります。

int main(int number, char *arg[])

次に、次のように、印刷中に 2 次元配列のようにアクセスします。

for(i=0;i<strlen(argv[0]);i++)
    printf("%c",arg[0][i]);

または、インデックス 0 の文字列を出力するだけです。

printf("%s",arg[0]);
于 2012-10-21T13:20:32.907 に答える
2

のタイプが欠落しているためですargv。OS は引数を事前に解析する (スペースで区切る) ため、文字列の配列が得られます。あなたは書くべきです:

int main(int argc, char **argv)
{
    int i;
    for (i = 0; i < argc; i++) {
        printf("%s ", argv[i]);
    }

    return 0;
}

コマンドライン呼び出し全体を元に戻すため。

追伸: argc と argvの引数には実際に名前を付ける必要があります。main()それは慣用的であり、そうしないのは奇妙です。

于 2012-10-21T13:22:16.963 に答える
0

メイン関数は、慣例により、最初のパラメーターとして int を取ります (これはコードでは問題ありません) が、2 番目のパラメーターは文字の配列 ( char *argv[]) へのポインターである必要があります。

プログラムが呼び出されると、この配列内にそのパラメーターがあるため、これはそうでなければなりません。を呼び出す./a.out foo barと、配列は次のようになります

arg[0] = "./a.out"
arg[1] = "foo"
arg[2] = "bar"

整数には、プログラムに与えられた引数の数である 3 が含まれます。

プログラムに与えられた引数の数とその引数を出力したい場合は、コードを次のように変換する必要があります。

int main(int number, char *arg[]) // the right main prototype
{
    int i;

    printf("%d\n",number);

    for(i=0;i<number;i++) // from i = 0 to the number of parameters
        printf("%s\n",arg[i]); // print a string (%s)

    return 0;
}
于 2012-10-21T13:25:02.483 に答える
0

の署名mainは、int main (int argc, char* argv[])つまりargv、文字の配列ではなく、文字列の配列です。

于 2012-10-21T13:20:51.787 に答える