2017-01-20 6 views
0

文字列の可変配列を反復処理する最良の方法は何ですか?たとえば:Cでの文字列操作の配列

struct Book{ 
    char chapter_names[20][50]; 
    int chapters; 
    ...} 

int main(){ 
    struct Book Redwall; 
    strcpy(*chapter_names, "The Wall"); 
    strcpy(*(++chapter_names), "The Grove"); 

    printf("Chapter 1: %s", chapter_names[0]); 
    printf("Chapter 2: %s", chapter_names[1]); 

    return 0; 
} 

私はこれの出力はになりたい:

Chapter 1: The Wall 
Chapter 2: The Grove 

このコードは、あなたがアレイ上でそのようなインクリメント演算子を使用することはできません

error: lvalue is required as increment operand 
+0

このコードをコンパイルするとどうなりましたか? –

+0

質問に編集しました – David

+0

'chapter_names'は配列です。配列をインクリメントすることはできません。 –

答えて

1

の結果構造体内にあります。

struct Book{ 
    char chapter_names[20][50]; 
    int chapters; 
    }; 

    int main(){ 
     struct Book Redwall; 
     strcpy(*(Redwall.chapter_names), "The Wall"); 
     strcpy(*(Redwall.chapter_names+1), "The Grove"); 

     printf("Chapter 1: %s\n", Redwall.chapter_names[0]); 
     printf("Chapter 2: %s\n", Redwall.chapter_names[1]); 

     return 0; 
    } 
+0

'strcpy()'の行にも 'Redwall.chapter_names [0]'などを使わないのはなぜですか?理解するのがずっと簡単で、遅くはありません。 –

+0

正確に。 OPはこれに少し新しかったので、私はちょうど '(a [1] ==(a + 1))'の考え方を得たいと思っていました。そこで私は 'chapter_names + 1'を代入し、' chapter_names [1] 'を印刷しました。 – 16tons

+2

良い習慣を彼らに教えることは、既存の悪いものを奨励するよりはるかに良い。 –

0

あなたが持っているチャプター名の数を追跡するためのintがあるので、おそらくそれを使用するべきです。

Redwall.chapters = 0; // Make sure it's initialised first 
strcpy(Redwall.chapter_names[Redwall.chapters++], "The Wall"); 
strcpy(Redwall.chapter_names[Redwall.chapters++], "The Grove"); 

次に、forループを使用して、それぞれを循環させることができます。

for(i=0;i<Redwall.chapters;i++) { 
    printf("Chapter %d: %s", i+1, Redwall.chapter_names[i]); 
}