Как правильно отобразить двумерный массив строк?

0

Итак, это та таблица, которую я делаю

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string tables[5][14] = 
    { { "0", "3", "6", "9", "12", "15", "18", "21", "24", "27", "30", "33", "36", "2 to 1" },
    { "2", "5", "8", "11", "14", "17", "20", "23", "26", "29", "32", "35", "2 to 1" },
    { "1", "4", "7", "10", "13", "16", "19", "22", "25", "28", "31", "34", "2 to 1" },
    { "1st 12", "2nd 12", "3rd 12" },
    { "1-10", "Even", "Red", "Black", "Odd", "19-36" } };

     cout << tables << endl;
    return 0;    
}

Поэтому я запускаю этот код, и мой компилятор не показывает никаких ошибок, но все, что напечатано, - это странная строка букв и цифр,

007EF610

Я никогда не сталкивался с этим раньше и мог действительно использовать некоторые советы, спасибо за ваше время!

  • 2
    Это не странная строка букв / цифр, это шестнадцатеричная.
Теги:
string
arrays

5 ответов

2

Ваш код печатает tables, которые являются адресом первой строки. Если вы хотите напечатать все строки, содержащиеся в массиве массива строк, вам нужно написать цикл самостоятельно, который проходит через все tables[i][j], например:

for(int i=0; i<5; ++i)
{
  for(int j=0; j<14; ++j)
  {
    cout << tables[i][j] << endl;
  }
}
1

Вы знаете, что в C и C++ просто печать имени переменной не будет печатать его содержимое, если это ничего, кроме простых типов данных, то есть int, float, long, string, char т.д.

переменные tables, как вы сказали, представляют собой 2D-массив. Чтобы распечатать его содержимое, вам нужно перебрать каждый элемент в массиве и распечатать его:

for(int i=0; i<5; i++) {
      for(int j=0; j<14; j++){
        cout<<tables[i][j]<<'\t';
      }
      cout<<endl;
}

PS: то, что вы получаете как вывод - 007EF610 - это базовый адрес 2D-массива, то есть местоположение в памяти, где оно хранится.

1

Вы пытаетесь сделать что-то вроде этого:

#include <iostream>
#include <string>

#define ROWS 5
#define COLS 14

using namespace std;

int main()
{
    string tables[ ROWS ][ COLS ] =
    {
        { "0", "3", "6", "9", "12", "15", "18", "21", "24", "27", "30", "33", "36", "2 to 1" },
        { "2", "5", "8", "11", "14", "17", "20", "23", "26", "29", "32", "35", "2 to 1" },
        { "1", "4", "7", "10", "13", "16", "19", "22", "25", "28", "31", "34", "2 to 1" },
        { "1st 12", "2nd 12", "3rd 12", "", "", "", "", "", "", "", "", "", "", "" },
        { "1-10", "Even", "Red", "Black", "Odd", "19-36", "", "", "", "", "", "", "", "" }
    };

    for ( int i = 0; i < ROWS; i++ )
    {
        for ( int j = 0; j < COLS; j++ )
        {
            cout << tables[ i ][ j ] << " ";
        }

        cout << endl;
    }

    system( "pause" );

    return 0;    
}

Вывод:

0 3 6 9 12 15 18 21 24 27 30 33 36 2 to 1 
2 5 8 11 14 17 20 23 26 29 32 35 2 to 1  
1 4 7 10 13 16 19 22 25 28 31 34 2 to 1  
1st 12 2nd 12 3rd 12

Что происходит в вашем коде: вы предположили, что cout << tables << endl может распечатать всю таблицу. Но это не так. cout не может автоматически получать информацию о вашей таблице. Таким образом, вы должны закончить над ним.

Номер, который вы получили (например, 007EF610), фактически является адресом массива tables в памяти.

1

Во-первых, правильно инициализируйте массив (вам нужно заполнить каждую запись [5] [14]:

string tables[5][14] =
{
   { "0", "3", "6", "9", "12", "15", "18", "21", "24", "27", "30", "33", "36", "2 to 1" },
   { "2", "5", "8", "11", "14", "17", "20", "23", "26", "29", "32", "35", "2 to 1", "" },
   { "1", "4", "7", "10", "13", "16", "19", "22", "25", "28", "31", "34", "2 to 1", "" },
   { "1st 12", "2nd 12", "3rd 12", "", "", "", "", "", "", "", "", "", "", "" },
   { "1-10", "Even", "Red", "Black", "Odd", "19-36", "", "", "", "", "", "", "", "" }
};

Затем пропустите его, пропустите пустые значения:

for(int i=0;i<5;i++){
    for(int j=0;j<14;j++){
        if (!tables[i][j].empty()) {
            cout << tables[i][j] << " ";
        }
    }
    cout << endl;
}

Вывод:

0 3 6 9 12 15 18 21 24 27 30 33 36 2 to 1 
2 5 8 11 14 17 20 23 26 29 32 35 2 to 1 
1 4 7 10 13 16 19 22 25 28 31 34 2 to 1 
1st 12 2nd 12 3rd 12 
1-10 Even Red Black Odd 19-36 

Полный код:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string tables[5][14] =
    {
       { "0", "3", "6", "9", "12", "15", "18", "21", "24", "27", "30", "33", "36", "2 to 1" },
       { "2", "5", "8", "11", "14", "17", "20", "23", "26", "29", "32", "35", "2 to 1", "" },
       { "1", "4", "7", "10", "13", "16", "19", "22", "25", "28", "31", "34", "2 to 1", "" },
       { "1st 12", "2nd 12", "3rd 12", "", "", "", "", "", "", "", "", "", "", "" },
       { "1-10", "Even", "Red", "Black", "Odd", "19-36", "", "", "", "", "", "", "", "" }
    };
    for(int i=0;i<5;i++){
        for(int j=0;j<14;j++){
            if (!tables[i][j].empty()) {
                cout << tables[i][j] << " ";
            }
        }
        cout << endl;
    }
    return 0;
}
0

Сначала поймите, что значит эта декларация

string tables[5][14]

Это означает, что таблица представляет собой массив 2d (который содержит 5 строк и 14 столбцов) строкового объекта

Это поможет вам понять ошибку, которую вы совершили

Ещё вопросы

Сообщество Overcoder
Наверх
Меню