【问题标题】:Finding the number of TCHAR* in TCHAR** . How?在 TCHAR** 中查找 TCHAR* 的数量。如何?
【发布时间】:2014-08-05 13:24:37
【问题描述】:

在这里我遇到了一个具有挑战性的案例。我有一个 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 作为结果).. 但是这里有什么方法可以获取字符串的数量吗?

【问题讨论】:

  • 使用矢量并选择charwchar_t,具体取决于您是否要支持Windows 9x(提示:如果您打算将这些用于Windows API 函数,只需使用wchar_t) ,然后将TCHAR * 更改为std::[w]string。现在,您甚至没有正确使用指针。例如,您为 one TCHAR 分配值 _tcslen(_T("aaa")) 等等。即使你分配了一个数组,它对于你复制的内容来说也太短了。
  • TCHAR 只是一个字符,不是吗?
  • 要动态地执行此操作,请创建第 4 个元素并在那里放置一个 NULL 指针。所以你可以使用NULL 作为列表结束的指示器。
  • 啊,他的意思是new TCHAR[_tcslen(_T("aaa"))];吗?
  • 请勿使用TCHAR,除非您将旧版 Windows APP(NT 之前)移植到新窗口。尽管 MSDN 使用它和派生类型进行原型和解释,但这只是为了避免分别提及 Ansi 和 Wide 版本。

标签: c++ arrays pointers multidimensional-array


【解决方案1】:

如果您只有一个指向其中一项的指针,则无法知道数组中有多少项。

您需要通过另一个变量或列表末尾的标记值来记住此信息。最好包裹在一个包含指针和知道如何查找长度的函数的单元中。

很有可能您的代码也可以对内存管理进行其他改进,几乎没有理由将new 用于字符串。

【讨论】:

    【解决方案2】:

    使用std::vector<std::basic_string<TCHAR>>。这将自动记录字符串、它们的长度、有多少以及何时释放它们。在给定一个指向一个随机元素的指针之后,您无法知道任意数组中有多少项。

    另外,整个TCHAR 的事情,真的吗?那是20年前的东西。现在每个人都使用 Unicode。

    【讨论】:

      【解决方案3】:

      您可以使用 NULL 指针数组(纯 C 风格)或 std::vector。说到 NULL 指针数组...

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

      【讨论】:

      • 不应该是TCHAR[_tcslen(_T("aaa")) + 1];
      • 是的,当然。原始代码肯定会导致段错误:) 固定答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多