2016-11-12 6 views
7

問題の周りに頭を抱えているように見えません。私は何が欠けていますか?Cの配列ポインタに値を出力

これはARGVのすべての値を出力します

int main(int argc, char *argv[]) { 
    while (*argv) { 
     printf("argv[] is: %s\n", *argv); 
     ++argv; 
    } 

    return 0; 
} 

次考えてみましょう。だから、このよう./example arg1 arg2などのコマンドラインは出力以下になります。

`argv[] is: ./example` 
`argv[] is: arg1` 
`argv[] is: arg2` 

は今(私はとのトラブルを抱えていた)次の点を考慮してください

int main(void) { 
    char *days[] = { 
     "Sunday", 
     "Monday", 
     "Tuesday" 
    }; 
    while (*days) { 
     printf("day is %s\n", *days); 
     *days++; 
    } 

    return 0; 
} 

私がコンパイルしようとすると、私はエラーcannot increment value of type 'char *[3]'

を取得します

*days++(*days)++に変更すると、コンパイルされます。もし私がそれを実行すると、それは永遠に実行され、最終的にはbus errorで失敗します。

ただし、days[]のすべての値を繰り返すわけではありません。私は、効果のない日配列の'\0'"\0"という形でNullポインタを入れようとしました。

私には何が欠けていますか?

+0

http://ideone.com/GM4wIN – BLUEPIXY

+0

'++ ARGVを参照してください;' '*日++対;'! – alk

答えて

7

あなたはあなたのコード内のいくつかのエラーを持っている:変数argvと定数daysの間に違いがあり

  1. 。変数は変更でき、定数配列ラベルは変更できません。

  2. ご使用のアレイでは、終端文字NULLが配列の最後にありません。

  3. *days++;この場合、無意味です。これはダミーで、daysの値を返し、それ以降はdaysを返します。 days++を使用すれば十分です。

このように、あなたのコードは次のようにする必要があります

#include <stdio.h> 

int main(void) { 
    char *days[] = { 
     "Sunday", 
     "Monday", 
     "Tuesday", 
     NULL 
    }; 
    char **d = days; 
    while (*d) { 
     printf("day is %s\n", *d); 
     d++; 
    } 

    return 0; 
+0

私はchar * days []を宣言したときに実際にポインタを作成しなかったので、配列を作成しましたか? * dという名前のポインタに配列を配置しなければならなかったのはなぜですか?だから私はポインタarithmnaticを使用することができますか? –

+0

はい。詳細を知りたい場合は、オプション-Sでプログラムをビルドし、アセンブリコードを確認してください。 – maxihatop

0

文字ポインタをインクリメントしようとするのではなく、おそらく文字配列の各要素をループする必要があります。例えば

は:

char *days[] = { 
    "Sunday", 
    "Monday", 
    "Tuesday" 
}; 
int i;  
for (i = 0; i < 3; i++) 
    printf("day is %s\n", days[i]); 
+0

3はおそらく 'sizeof(days)/ sizeof(days [0])'や列挙定数 'enum {NUM_DAYS = sizeof(days)/ sizeof(days [0])};やそれに類するもの。または、 'main()'に渡されたときに 'argv'と同様に、センチネルのNULLポインタを使ってデータの終わりをマークします。しかし、' main() 'の引数は、' argc'を反復'argv'を通して(あるいは' argv'の最後にNULL要素を省略することもできます)、冗長性を持つ方が便利です。 –

1
  1. daysは、2Dの文字列です。配列の名前は最初のアドレスを指していますが、ポインタではありません。配列名に対してポインタ演算を行うことはできません。
  2. while (*days)は決して偽になりません。ロジックを変更する必要があります。

以下のコードでは、ほとんどのコードを保持しています。

#include <stdio.h> 

    int main(void) { 
     char *days[] = { 
      "Sunday", 
      "Monday", 
      "Tuesday" 
     }; 

     for(int i=0; i < 3; i++) { 
      printf("day is %s\n", (days[i])); 
     } 

     return 0; 
5

argv []構造体には、コードが動作する最後のエントリとしてNULLポインタが含まれています。データ構造にヌルポインタを追加することができます。また、argvは、コマンドライン引数を保持する内部データ構造を指すパラメータ(ローカル変数のようなもの)であることに気付く必要があります。配列を反復処理できる同様のローカル変数を作成する必要があります。

ここ

がソリューションです:

#include <stdio.h> 
int main(void) { 
    char *days[] = {"Sunday", "Monday", "Tuesday", 0 }; 
    char **v = days; 

    while (v) { 
    printf("day is %s\n", *v); 
    v++; 
    } 

    return 0; 
} 
+0

OK、なぜダブルアステリックス** v?それはポインタへのポインタですか?私はまだいくつかの例で**を見てきました。 –

+1

@fizzydrink:あなたのコードでは、 'char * argv []'という関数パラメータ定義があります。そのコンテキストは 'char ** argv'と同じです。それを置き換えるだけで、再コンパイルして啓発になります。 – alk

+0

@alk私はそれを試してみる必要がありますありがとう –