1 Востаннє редагувалося pika1989 (03.08.2015 23:28:26)

Тема: Функція printf та масиви

Задача: реалізувати гру хрестики-нулики. Малюю поле таким чином:

void paintGameField()
{
    cout << "\tNoughts and Crosses game\n\n";
    string field = "\n   |   |\
                   \n %c | %c | %c\
                    \n___|___|___\
                 \n    |    |\
                   \n %c | %c | %c\
                    \n___|___|___\
                  \n   |     |\
                   \n %c | %c | %c\
                    \n     |      |\n";

    printf(field.c_str(), game_field[0][0], game_field[0][1], game_field[0][2],
    game_field[1][0], game_field[1][1], game_field[1][2],
    game_field[2][0], game_field[2][1], game_field[2][2]);
}

Відповідно, при старті маю (масив ініціалізую пробілами):
http://i.imgur.com/kjOeXBe.png?1

Тоді легко можна ставити хрестик чи нулик в масив. Але, власне, питання:
чи можна спростити передачу масиву як параметр у функцію printf? (схоже до python стилю)
Або, якщо це ніяк не можливо, то як зробити краще?

2

Re: Функція printf та масиви

cout і printf в одній програмі краще не змішувати. Це різні мови.
Масив в printf передати можна тільки символьний, і він обробляється як рядок ("%s"). А вам потрібен, вочевидь,

Прихований текст

цикл

Подякували: pika19891

3

Re: Функція printf та масиви

Добре, cout i printf більше не змішуватиму. А щодо циклу - як??? Пробувала через sprintf - то ця функція лише з char працює, і шось ніяк не можу з циклом до толку довести:

char test[255] = "\n   |   |\
\n %c | %c | %c\
\n___|___|___\
\n   |   |\
\n %c | %c | %c\
\n___|___|___\
\n   |   |\
\n %c | %c | %c\
\n   |   |\n";
   
    for (int i = 0; i < FIELD_SIZE; i++)
        for (int j = 0; j < FIELD_SIZE; j++)
            sprintf_s(test, test, game_field[i][j]);
    printf(test);

І в результаті взагалі якась біда:

Прихований текст

http://i.imgur.com/ZvtBXYN.png?1

4

Re: Функція printf та масиви

sprintf "вдруковує" в перший рядок те, що знаходиться в другому (і розкриває різні %c). Ви змінюєте другий параметр прямо під час друку (тим, що виводите в нього), відповідно, результат виходить дуже дивний. Крім того, коректна заміна відбувається тільки для першого %c, решта замінюється на невизначені значення зі стеку, бо sprintf не "чекає" на цикл, а одразу вносить всі 9 %c в кожному проході циклу.
Коли я казав про цикл, я мав на увазі щось таке:

перша декомпозиція
int i = 0;
while(1) {
  //друкуємо x та 0
  if( ++i > 2 ) break ; //вихід з середини циклу
  printf("\n___|___|___"
         "\n   |   |"); //не люблю форматування рядків через \
}
друга
int i = 0;
while(1) {
  int j = 0;
  while(1) {
    printf(" %c ", game_field[i][j]);
    if( ++j > 2 ) break ; //вихід з середини циклу
    printf("|");          //друкуємо вертикальні лінії
  }
  if( ++i > 2 ) break ; //вихід з середини циклу
  printf("\n___|___|___" //друкуємо горизонтальні рядки
         "\n   |   |\n"); //не люблю форматування рядків через слеш
}

А взагалі в C++ краще cout використовувати, але то вже таке.

5

Re: Функція printf та масиви

Дякую, зробила через цикл і використала cout.