Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在TCHAR**中查找TCHAR*的数量。怎样_C++_Arrays_Pointers_Multidimensional Array - Fatal编程技术网

C++ 在TCHAR**中查找TCHAR*的数量。怎样

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"));

在这里,我遇到了一个具有挑战性的案件。。我有一个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"));
  _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:)固定答案。