2015-05-17 2 views
0

Я пытаюсь напечатать матрицу символов, используя одиночные puts вместо вложенных циклов, но я всегда получаю еще один символ в конце печати. Я собираюсь сделать игру в понг, и мне нужно как можно быстрее обновить экран.Печать матрицы без петель

void main() 
{ 
    int x, y; 
    char map[40][80]; 

    for(y=0; y<40; y++) 
    { 
     for(x=0; x<80; x++) 
     { 
      map[y][x]='o'; //Just for testing. 
     } 
    } 
    puts(map); 
} 

Последние две строки, напечатанные с помощью этого кода являются:

ooooooooooooo...o (80 'o's) 
< 
+0

Да, я набрал неправильно. mapa на самом деле карта. Язык - C. – Uzai

+1

Строки должны быть нулевыми. – OldProgrammer

ответ

0
#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    int x, y; 
    char map[40*80+1]; 

    for(y=0; y<40; y++) { 
     for(x=0; x<80; x++) { 
      map[y*80+x]='o'; 
     } 
    } 
    map[40*80] = '\0'; 
    puts(map); 

    return 0; 
} 

Я изменить карту для линейного массива. Таким образом, проще добавить \0 в конец, чтобы закрыть строку. Без \0 команда puts() не знает, когда прекратить печать. В вашем случае это было всего лишь <, но это могло привести к печати большого количества символов!

Кроме того, я бы не стал полагаться на то, что многомерный массив линейно отображается в памяти.

+0

Это сработало! Благодаря! – Uzai

+0

«Я бы не стал полагаться на то, что ...»: вы правы в целом, но для char-массива это гарантируется стандартом. 'sizeof (char) определяется как 1. Отметьте, что он не подразумевает CHAR_BIT == 8. Также может оказаться целесообразным завершение каждой строки новой строкой, чтобы получить прямоугольный вывод, независимо от размеров консоли. – Olaf

+0

размеры должны быть #defines. Скорее всего, они понадобятся позже в коде, поэтому нет необходимости иметь их повсюду, а четкое имя значительно увеличивает читаемость. – Olaf

0

Вы можете использовать fwrite(3) (или write(2), если вы не хотите буферизацию, но вы, вероятно, если вы очистки экрана в той же записи).

fwrite(map, 80, 40, stdout); // or any two numbers whose product is 80*40 

или

write(1, map, 80*40); 
Смежные вопросы