C++ 在TCHAR**中查找TCHAR*的数量。怎样
在这里,我遇到了一个具有挑战性的案件。。我有一个C++代码,下面是C++ 在TCHAR**中查找TCHAR*的数量。怎样,c++,arrays,pointers,multidimensional-array,C++,Arrays,Pointers,Multidimensional Array,在这里,我遇到了一个具有挑战性的案件。。我有一个C++代码,下面是 TCHAR **x= NULL; x= new TCHAR*[3]; x[0] = new TCHAR(_tcslen(_T("aaa"))); x[1] = new TCHAR(_tcslen(_T("bbb"))); x[2] = new TCHAR(_tcslen(_T("ccc"))); _tcscpy(x[0],_T("aaa")); _tcscpy(x[1],_T("bbb"));
TCHAR **x= NULL;
x= new TCHAR*[3];
x[0] = new TCHAR(_tcslen(_T("aaa")));
x[1] = new TCHAR(_tcslen(_T("bbb")));
x[2] = new TCHAR(_tcslen(_T("ccc")));
_tcscpy(x[0],_T("aaa"));
_tcscpy(x[1],_T("bbb"));
_tcscpy(x[2],_T("ccc"));
我分配了3个Tchars值,但如果我不知道“x”包含的元素数(可能有10个字符串)。。如何获得元素的确切数量
如果是二维阵列,我可以通过
result = (sizeof(x)/sizeof(x[0]));
因此,它将向我显示其中的行数(在示例中,我将得到3行作为结果)。。但是这里有没有办法得到字符串的数目 如果只有一个指向其中一个项的指针,则无法知道数组中有多少项 您需要通过另一个变量或列表末尾的sentinel值来记住此信息。最好封装在一个包含指针和一个知道如何找到长度的函数的单元中
很有可能在代码中也可以对内存管理进行其他改进,几乎没有理由对字符串使用
new
您可以使用空指针数组(普通C样式)或std::vector。说到空指针数组
TCHAR **x= NULL;
x= new TCHAR*[4];
x[0] = new TCHAR[_tcslen(_T("aaa"))+1];
x[1] = new TCHAR[_tcslen(_T("bbb"))+1];
x[2] = new TCHAR[_tcslen(_T("ccc"))+1];
x[3] = NULL;
_tcscpy(x[0],_T("aaa"));
_tcscpy(x[1],_T("bbb"));
_tcscpy(x[2],_T("ccc"));
int size=0;
TCHAR ** y = x;
while(*y++) size ++;
printf("Array size is: %d", size);
使用std::vector
。这将自动记录字符串的数量、长度、数量以及何时释放它们。在给定指向一个随机元素的指针后,您无法知道任意数组中有多少项
还有,整件事,真的吗?那是20年前的事了。现在每个人都使用Unicode。使用一个向量,根据您是否想要支持Windows 9x,选择
char
或wchar\u t
(提示:如果您打算将其放入Windows API函数中,只需使用wchar\u t
),然后将TCHAR*
更改为std:[w]string
。现在,你甚至没有正确使用指针。例如,您分配一个TCHAR
,其值为\u tcslen(\u T(“aaa”)
,以此类推。即使您分配了一个数组,它对于您复制的内容来说也太短了。TCHAR只是一个字符,不是吗?要动态执行此操作,请创建第四个元素并在那里放置一个NULL
指针。因此,您可以使用NULL
作为列表结尾的指示符。啊,他是指newtchar[\u tcslen(\u T(“aaa”))]代码>替代?除非您正在将旧的windows应用程序(NT之前版本)移植到新的windows,否则不要使用TCHAR
。尽管MSDN使用它和派生类型作为原型和解释,但这只是为了避免分别提及Ansi和Wide版本代码>当然可以。原始代码将明确导致SEGFULT:)固定答案。