2013-04-14 2 views
0

Я делаю модель лесного пожара, которая моделирует распространение огня. Вместо того, чтобы показывать лес графически, нам было поручено вывести лес на консоль в виде обычного текста. В результате на выходе очень трудно различить, поэтому я решил покрасить различные элементы, как таковойПочему я получаю segfault при конкатенировании строк?

int i; 
int j; 

//Initialize a string for what will be outputted to the screen 
char output[2000]=""; 
//Initialize strings that will be concat'd to the main string 
char tree[]= "\033[22;31m T \033[22;30m"; 
char burn[]=" B"; 
char dirt[]=" D"; 
char fizzled[]=" F"; 
char newl[]="\n"; 
for(i=0;i<25;i++){ 
    for(j=0;j<25;j++){ 
     if(forest[i][j]==1){ 
      strcat(output, tree); 
     }else if(forest[i][j]==500){ 
      strcat(output,burn); 
     }else if(forest[i][j]==-1){ 
      strcat(output,fizzled); 
     } 
     else{ 
      strcat(output,dirt); 
     } 

    } 

    strcat(output,newl); 

} 
printf("------------------------------------------\n"); 
printf("%s",output); 

Здоровые деревья окрашены по-разному в первой итерации, как они должны. Однако он возвращает segfault, и я не знаю, почему это происходит.

Благодаря

+1

Как определяется лес? Где происходит segfault? –

+1

Каждое дерево использует 19 символов; другие используют 2 символа. У вас есть 25 * 25 = 625 записей, чтобы вписаться в массив байтов 2000. Вы не можете позволить себе даже 100 деревьев в вашем лесу, не исчерпывая место в 'output'. –

ответ

4

Похоже, что вы переполнены ваш output массив.

"\033[22;31m T \033[22;30m" длиннее 15 символов (я точно не считал). В худшем случае, когда все деревья, вы можете получить этот шаблон 25 * 25 раз, а сумма будет больше 15 * 25 * 25 = 9375 символов. И char output[2000] может содержать только 2000 из них.

Btw, если вы намерены использовать N символов в output[], вы должны зарезервировать еще 1 в массиве для терминатора строки NUL, '\0'.

+1

'' \ 033 [22; 31m T \ 033 [22; 30m "' - 19 символов, что означает escape-последовательности. – icktoofay

+0

@icktoofay Спасибо! –

+1

Я подсчитал 19 символов на дерево; это лишь незначительная разница в заключении. –

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