11

私は C の初心者で、過去 1 時間か 2 時間、自分のコード コードの何が問題なのかを突き止めようとしていました。私は K&R の本を読んでいて、ずっと目を通していますが、それでも私の論理の間違いを理解していません。

while (*argv>0){
    while (**argv>0){
        printf("%c\n",**argv);
        **argv++;
    }
    argv++;
}

タスク:argv を使用してプログラムに渡されるすべての引数を出力します。

私の理解では、argv は、文字ポインターの配列へのポインターをさらに含む配列へのポインターです。したがって、*argv>0 の間、または最初の配列にまだ要素がある間は、最初の配列から次の配列へのポインターをたどるべきだと言いました。次に、次の配列のすべての要素を出力する必要があります。

4

4 に答える 4

11

この行に * が多すぎます:

**argv++;

次のようになります。

*argv++;

さらに、++操作の優先度が高いため、中かっこを追加します。

(*argv)++;

そして、それはうまくいきます。

于 2012-06-02T00:50:37.940 に答える
9

添字表記 ( ) で同じことができる場合と同じように、ポインターの逆参照を使用して混乱しないことをお勧めします[]

#include <stdio.h>

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

これargv[0]により、プログラムの名前/パスである も出力されます。

私のコードは何をしますか?が false (別名)に解決されると、要素からfor(i = 0; argv[i]; i++)カウントアップします。これは、配列の最後の要素です。そして、配列内のすべての要素に対して、フォーマット指定子を使用して出力します。最初で唯一のパラメータとして を に渡すこともできますが、これは特定の文字列フォーマット攻撃への扉を開くため、通常は嫌われます。i0argv[i]0NULLargv%sprintfargv[i]printf

于 2012-06-02T00:37:24.760 に答える
6

argvchar *argv[]、つまり文字列の配列へのポインタ ( char*'s) です。argv++配列内の次の文字列に移動します。

通常、この関数は次のように記述されます。


int main(int argc, char *argv[]){
   int i;
   for (i = 0; i < argc; i++){ //loop from 0 to argc (argument count)
      printf("%s ", argv[i]);
   }
   return 0;
}


于 2012-06-02T00:32:00.707 に答える
2

これは動作します::

while(argc--)//can't use *argv here, because *argv would be the  address of the 
              // element which argv is pointing to, just by knowing the address u can't say whether it still has elements or not
{
    while( **argv )
    {
        printf("%c", **argv);
        (*argv)++;  //by using **argv++, you are actually moving argv to next array, not to the next character of current array 
    }
    argv++;
    printf("\n");//move your \n to here, else you will end up printing every character in a new line
}
于 2012-06-02T00:57:27.980 に答える