想要这样的一个数据,如果是静态的,可以用C语言来定义:
char array[][3][100] =
{
{"ABC01", "ABC02", "ABC03"},
{"ABC11", "ABC12", "ABC13"},
{"ABC21", "ABC22", "ABC23"},
{"ABC31", "ABC32", "ABC33"},
};
注意:上面的声明是初始化了4行,每行3列,每个空间为不超过100个的字符(含‘\0’);
如果是动态的数据,如何声明并使用,下面使用MFC中的CArray<CStringArray, CStringArray &>编译失败:
CStringArray ssRows;//每一行字符串数组
CArray<CStringArray, CStringArray &> array;//之后去掉了&,仍旧编译失败
//
// 创建一个二维的字符串表格
//
int i, j;
array.RemoveAll();
for (i=0; i<100; i++)
{
ssRows.RemoveAll();
for (j=0; j<5; j++)
{
CString str;
str.Format("ABC%d%d", i, j);
ssRows.Add(str);
}
array.Add(ssRows);
}
//
// 访问这个字符串表格
//
for (i=0; i<array.GetSize(); i++)
{
ssRows = array.GetAt(i);
for (j=0; j<ssRows.GetSize(); j++)
{
CString str = ssRows[j];
TRACE("%s\t", str);
}
TRACE("\n");
}
编译失败的原因不明白!
在网上查到,据说CArray<CStringArray *, CStringArray *>是成功的,但考虑到引进来指针,对CString、CStringArray的内存分配、构造函数、析构函数不熟,没在这上面多花心思;
换成声明vector<CStringArray> array;仍旧编译失败:
CStringArray ssRows;
vector<CStringArray> array;
int i, j;
//创建二维字符串表格
for (i=0; i<100; i++)
{
ssRows.RemoveAll();
for (j=0; j<5; j++)
{
CString str;
str.Format("ABC%d%d", i, j);
ssRows.Add(str);
}
array.push_back(ssRows);
}
//访问二维字符串表格
for (i=0; i<array.size(); i++)
{
ssRows = array[i];
for (j=0; j<ssRows.GetSize(); j++)
{
CString str = ssRows[j];
TRACE("%s\t", str);
}
TRACE("\n");
}
最后还是全部使用STL, vector<vector<string> >,成功:
vector<string> ssRows;
vector<vector<string> > array; //小心两个>>不要连在一起!!
int i, j;
//创建二维字符串表格
for (i=0; i<100; i++)
{
ssRows.clear();
for (j=0; j<5; j++)
{
char buf[100] = {0};
sprintf(buf, "ABC%d%d", i, j);
string str(buf);
ssRows.push_back(str);
}
array.push_back(ssRows);
}
//访问二维字符串表格
for (i=0; i<array.size(); i++)
{
ssRows = array[i];
for (j=0; j<ssRows.size(); j++)
{
string str = ssRows[j];
TRACE("%s\t", str.c_str());
}
TRACE("\n");
}
使用STL唯一的不便是和CString单字节、双字节UNICODE及多字节之间的转换,好在VC中为每个字符串操作函数提供了字符集映射。