2012-03-25 15 views
3

は、私がchar **argvを持っていると仮定します。ダブルポインタchar型の操作

まず、どのように私はargv内のすべての文字列をプリントアウトすることができますか?私は、次のことを試してみました。ここで

char *temp; 
temp = *argv; // Now points to the first string? 
while (temp != NULL) { 
    printf("%s ", temp); 
    temp++; 
} 

tempがインクリメントされたときに、それだけで一つの文字をスキップします。なぜそれが起こっているのですか?私はargvがポイントを保持する配列であることを知っています。各ポインタは、char*の配列を指しています。もしそうなら、なぜこれは機能しませんか?私はtempがタイプcharであるため、そのポインタをインクリメントする1文字(またはバイト)で、それをインクリメントすることを知っています。もしそうなら、どうすればポインタを次の配列にインクリメントし、その文字列を出力できますか?

答えて

6

tempcharへのポインタであるので、それが唯一の1文字をスキップします。これを追加することで、ポインタを次のメモリのcharを指すように移動するようにコンパイラに指示します。

argvは、ポインタの配列です。あなたがする必要があるのは、各反復で次のポインタに移動することです。何かのように:

char **temp = argv; // temp is a pointer to a *pointer*, not a pointer to a *char* 
while (*temp != NULL) { 
    printf("%s ", *temp); 
    temp++; 
} 
6

あなたはargv、ない*argvをインクリメントする必要があります。ローカルコピーを使用すると、これはそうのようになります。

for (char ** p = argv; *p; ++p)  // or "*p != NULL" 
{ 
    char * temp = *p;    // now points to the first string! 
    printf("%s ", temp);    // or just "printf("%s", *p);" 
} 
+0

argvの最後の要素はnullですか?私はこれが配列の終わりからはずれると予想します。 – Collin

+4

@CollinHockey:はい、標準ではそれが必要です。 C99規格の5.1.2.2.1を参照してください。 –

+0

@CollinHockey:OPの中断的な試みに踏み込んで、私はそのように仮定します。また、他に明白な終了条件がないためです。 Oli:OPは、我々が標準の 'main'引数を扱っているとは言っていませんが、私たちが行うふりをしましょう。 –

1

まず、あなたはchar** argvが何であるかを理解する必要があります。 charへのポインタの配列です。この配列内のポインタは、必ずしもアドレス空間内のお互いの近くに存在するとは限りません。あなたが欲しいのはこれです:

char** temp; 
temp = argv; 
while(temp != argv + argc) { 
    printf("%s ", temp); 
    temp++; 
} 

charのポインタの最初の要素へのポインタが必要です。代わりにそれを増やしてください。

+0

'argc'はありません。それは標準的な主要な議論ではない。 – darksky

0

あなたはargvない*argvをインクリメントする必要があります。あなたのargvmain関数のパラメータがある場合、それは変更可能であることに注意してください、あなたはこのようにそれを使用することができます:

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

それは動作しますが、それは少し破壊的です。 –

+0

文字列の値だけを印刷する必要がある場合は、これが最もコンパクトなフォームです。 – ouah

0

何あなたはおそらくやりたいことはこれです:と同等です

char* a = argv[0]; // first arg 
char* b = argv[1]; // second arg 
char* c = argv[2]; // third arg 

これは

char* a = *(argv + 0); 
char* b = *(argv + 1); 
char* c = *(argv + 2); 

です。これをループに一般化します。

関連する問題