如何确定无符号字符的长度*?
答案 0 :(得分:29)
对于指针的实际大小:
size_t s = sizeof(unsigned char*);
如果你想要字符串的长度:
unsigned char* bla = (unsigned char*)"blabla";
int s = strlen((char*)bla);
答案 1 :(得分:9)
这可能有两个含义。你只是想知道指针类型有多大吗?如果是这样,那么Joce的答案是正确的
size_t size = sizeof(unsigned char*);
如果您想知道指针指向的元素数量,那就更复杂了。如果这是一个C风格的字符串,那么strlen或某些变体是您的最佳选择。
但是,如果这只是指向与C样式字符串无关的unsigned char的指针,那么就无法可靠地实现您正在寻找的内容。 C / C ++不会将长度字段与指针相关联。您需要使用指针传递长度或使用类似vector的类来存储指针和长度。
答案 2 :(得分:7)
在理想的世界里,你没有。你可以将char *用于C风格的字符串(它们是NUL终止的,你可以测量它的长度),而unsigned char *只用于字节数据(它的长度在另一个参数或其他任何参数中,你可能会进入尽快使用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风格的字符串,但它已经作为一个无符号字符*来到,那么你(a)将它转换为char *并继续使用它,而且(b) )找出谁对你做了这件事,并请他们停下来。
答案 3 :(得分:0)
你想要指针的长度,这将是一个int。如果您想要指向的字符串的长度,请使用strlen: 例如 指针大小:sizeof(unsigned char *) 字符串的大小:strlen(unsigned char *) 多字节字符将报告为..multi byte
答案 4 :(得分:0)
如果您正在使用C ++,并且它是一个unsigned char *中的字符串,那么在操作之前首先将它放入std :: string中会更好。这样你可以做各种各样的事情,并且仍然能够随时获得它的长度()和/或容量()。
我假设您正在对阵列进行操作以使其大小不变。如果你只是分配,设置和遗忘,你总是可以将数组的实际分配大小存储在一个单独的变量中 - 或者更好的是,创建一个struct / class。
//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。
答案 5 :(得分:0)
如果您使用C代码进行编译,则strlen()
函数参数可以处理“unsigned char*”;
但是在C ++代码中,参数无法处理"unsigned char*";
因此,如果您使用c ++代码进行编译,则需要强制翻译(unsigned char*)str.
答案 6 :(得分:-3)
通过unsigned char *我想你的意思是指向该指针的字符串。在那种情况下,它将是:
strlen(your_string_pointer)
但是,这只会找到\ 0位置。没有保证这是实际分配的内存块大小。