【问题标题】:How do you determine the length of an unsigned char*?如何确定 unsigned char* 的长度?
【发布时间】:2010-10-24 14:33:28
【问题描述】:

如何确定 unsigned char* 的长度?

【问题讨论】:

  • 大多数答案表明您需要指定“长度”的含义:元素的数量,包含指针的变量的大小,或者您可能指的是(无符号?)字符以零结尾字符串?

标签: c++ c char unsigned


【解决方案1】:

对于指针的实际大小:

size_t s = sizeof(unsigned char*);

如果你想要字符串的长度:

unsigned char* bla = (unsigned char*)"blabla";
int s = strlen((char*)bla);

【讨论】:

  • "blabla" 产生一个只读字符串,所以 bla 应该是 const unsigned char*。
  • 这不应该编译。 "blabla" 是一个 const char*,如果不进行强制转换,您不能将 const char* 分配给 unsigned char*。
  • 这不是赋值 - 它是初始化 - 一直在完成。
  • 布赖恩是对的。那没有编译。我已经对其进行了编辑,现在可以了。
  • 缺少第三个选项:分配的字符数组的长度。这与零终止符之前的字符数不同。
【解决方案2】:

通过 unsigned char * 我想你的意思是位于该指针的字符串。在这种情况下,它将是:

strlen(your_string_pointer)

但是,这只会找到 \0 位置。没有保证这是实际分配的内存块大小。

【讨论】:

【解决方案3】:

这可能有两种含义。您是否只想知道指针类型有多大?如果是这样,那么乔斯的答案是正确的

size_t size = sizeof(unsigned char*);

如果您想知道指针指向多少个元素,那就有点复杂了。如果这是一个 C 风格的字符串,那么 strlen 或一些变体是你最好的选择。

但是,如果这只是指向与 C 样式字符串无关的 unsigned char 的指针,那么就无法可靠地实现您正在寻找的内容。 C/C++ 不将长度字段与指针相关联。您需要使用指针传递长度,或者使用像 vector 这样的类来存储指针和长度。

【讨论】:

  • 您说得对,无法检索分配的长度——在许多人看来,这是一个糟糕的语言设计决定。您对有两个含义是错误的:可能是您需要知道所包含的以零结尾的字符串的长度,尽管使用带符号的字符会更好。把它变成两个半:)
【解决方案4】:

你想要指针的长度吗,这将是一个 int。如果您想要指向的字符串的长度,请使用 strlen: 例如 指针大小:sizeof(unsigned char*) 字符串大小:strlen(unsigned char*) 多字节字符将被报告为 ..multi byte

【讨论】:

  • 对。我应该说 size_t
【解决方案5】:

如果您使用的是 C++,并且它是 unsigned char* 中的字符串,则最好先将其放入 std::string 中,然后再对其进行操作。这样你就可以对它做各种各样的事情,并且仍然可以随时获取它的长度()和/或容量()。

我假设您正在对所述数组进行处理以使其大小不恒定。如果您只是分配、设置和忘记,您始终可以将数组的实际分配大小存储在单独的变量中 - 或者更好的是,创建一个结构/类。

//WARNING: memory issues not addressed here.
struct myStringStruct
{
  unsigned char * string;
  int len;

  allocate(int size) {
    len = size;
    string = malloc(sizeof(unsigned char) * len);
  }
}

比这更复杂,你正在重新发明 std::string。

【讨论】:

    【解决方案6】:

    在理想的世界里,你不会。您将 char* 用于 C 风格的字符串(以 NUL 结尾,您可以测量其长度),而 unsigned char* 仅用于字节数据(在另一个参数或其他参数中带有长度,您可能会进入ASAP 的 STL 容器,例如 vector<unsigned char>basic_string<unsigned char>)。

    根本问题是您无法对 char 和 unsigned char 的存储表示是否相同做出可移植的假设。他们通常是,但他们被允许不。因此,没有类似字符串的库函数可以在 unsigned char* 上运行,只能在 char* 上运行,通常将 unsigned char* 强制转换为 signed char* 并将结果视为字符串是不安全的。由于 char 可能已签名,这意味着不会将 unsigned char* 转换为 char*。

    但是,0 在 unsigned char 和 char 中始终是相同的值表示。所以在一个非理想的世界中,如果你从某个地方得到了一个 C 风格的字符串,但是它作为一个 unsigned char* 到达,那么你 (a) 将它转换为 char* 并继续它,但也 (b ) 找出是谁对你做了这件事,并请他们停止。

    【讨论】:

      【解决方案7】:

      如果你用c代码编译,strlen()函数参数可以处理“unsigned char*”; 但在 C++ 代码中,参数不能处理 "unsigned char*"; 所以如果你在c++代码编译需要强制翻译(unsigned char*)str.

      【讨论】:

        猜你喜欢
        • 2010-09-20
        • 2016-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多