6 votes

Imprimer un tableau de chaînes de caractères 2D

Je suis en train d'essayer d'initialiser un tableau de tic-tac-toe en c++ mais la sortie me donne toujours des valeurs hexadécimales. Existe-t-il un moyen de les transformer en valeurs de chaîne de caractères réelles ?

#include <iostream>
#include<string>

using namespace std;

int main()
{
    string tab[5][5] = { "1","|","2","|","3",
                         "-","+","-","+","-",
                         "4","|","5","|","6",
                         "-","+","-","+","-",
                         "7","|","8","|","9" };

    for(int i = 0; i <= 24; i++)
    {
        cout << tab[i] << endl;
    }
}

4voto

TankorSmash Points 3443

Vous envoyez la valeur de tab[i] à cout, donc vous obtenez l'adresse mémoire.

Vous voulez probablement obtenir les éléments plus profonds, comme tab[i][j].

4voto

Jack Deeth Points 1590

tab[i] est un std::string[] - c'est-à-dire, un tableau de std::string plutôt qu'un std::string en tant que tel.

Utilisez la syntaxe rangée de la boucle for pour votre sortie. En plus des conteneurs de la bibliothèque standard, elle fonctionne avec les tableaux intégrés :

for (const auto &row : tab) {
  for (const auto &c : row) {
    cout << c;
  }
  cout << endl;
}

2voto

cdonat Points 253

Bien sûr, les réponses qui proposent une boucle à la place de la sortie sont correctes. Si vous devez afficher votre champ de tic-tac-toe à de nombreux endroits différents dans votre application, vous pourriez préférer l'encapsuler. Une solution possible est d'avoir une classe tic-tac-toe :

struct TicTacToe : public std::array, 3> {
    TicTacToe() :
        // je ne suis pas sûr que l'initialisation fonctionnera ainsi
        std::array, 3>{{0,0,0},{0,0,0},{0,0,0}}
    {};
};

puis définir un opérateur de sortie pour celui-ci :

auto operator << (std::ostream& out, const TicTacToe& field)
    -> std::ostream& {
  return
      out << std::accumulate(std::begin(field),
                             std::end(field),
                             std::string{},
                             [](const std::string& a,
                                const std::array b)
                                 -> std::string {
                               return 
                                   std::accumulate(std::begin(b),
                                                   std::end(b),
                                                   std::string{},
                                                   [](const std::string& a, int b)
                                                       -> std::string {
                                                     return std::string{b < 0 ?
                                                                          "O" :
                                                                          (b > 0 ? "X" : " ")} +
                                                            (a.empty() ? "" : "|")
                                                   }) +
                                   (a.empty() ? "" : "\n-+-+-\n");
                             });

}

Veuillez noter que je n'ai pas testé ce code. Il est destiné à vous donner une idée, pas une source de copier-coller.

0voto

William Points 44

C'est bien mieux merci beaucoup !

#include 
#include
using namespace std;

int main()
{
    string tab[5][5] = { "1","|","2","|","3",
                         "-","+","-","+","-",
                         "4","|","5","|","6",
                         "-","+","-","+","-",
                         "7","|","8","|","9" };

    for(int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            cout << tab[i][j];

            if (j == 4)
            cout << endl;
        }   
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X