如何正确显示二维字符串数组?

时间:2014-12-02 04:40:27

标签: c++ arrays string

所以这就是我正在制作的表格

#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

我以前从未遇到这个问题,可以真正使用一些建议,谢谢你的时间!

5 个答案:

答案 0 :(得分: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 :(得分: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数组的地址。

答案 2 :(得分: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;
}

答案 3 :(得分:1)

您知道,在CC++中,只需打印变量名称就不会打印它的内容,如果它不是更简单的话数据类型,即intfloatlongstringchar等。

如你所说,变量tables是一个二维数组。要打印其内容,您需要遍历数组中的每个元素并打印:

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

PS:你输出的内容 - 007EF610 - 是2D数组的基地址,即内存中存储它的位置。

答案 4 :(得分:0)

首先要了解这个声明是什么意思

string tables[5][14]

这意味着table是一个2d数组(有5行和14列)的字符串对象

这有助于你理解你所犯的错误