2017-01-20 4 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

Почему бы не использовать 'Redwall.chapter_names [0]' etc в строках 'strcpy()' тоже? Было бы намного проще понять - и не медленнее. –

+0

Точно. Поскольку ОП выглядел несколько новым, я просто хотел, чтобы у него возникла идея «(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]); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^