我使用strlen函数来获取unsigned char指针的长度。但VS编译器会抛出以下警告。
unsigned char myString[] = "This is my string";
unsigned char* tmpBuffer = &myString[0];
size_t size = strlen(tmpBuffer);
warning C4057: 'function' : 'const char *' differs in indirection to slightly different base types from 'unsigned char *'
那么获取无符号字符指针大小以摆脱警告的正确方法是什么。
答案 0 :(得分:4)
rm
让你摆脱这个音符。在这里,您将其类型转换为strlen((const char*)tmpBuffer);
从standard开始,函数的原型是
strlen()
但是在这里你传递了size_t strlen(const char *s);
类型,这就是抱怨的原因。
此外,如果您使用它来简单地存储字符串,如示例所示。您可以毫无问题地使用unsigned char*
。
答案 1 :(得分:4)
使用strlen
是对O(1)问题的O(N)解决方案!
在编译时中已知数组的大小。使用成语sizeof(myString)
。这是NUL终结符的长度包括,因此将比strlen
结果大1。
当然,如果数组衰减指针类型,则无法使用sizeof
来获取长度。在这种情况下,您可以使用转换为const char*
:
size_t size = strlen((const char*)tmpBuffer);
注意到计数中包含 的NUL终止符。
由于代码中的奇怪性,需要进行演员表。字符串文字在C中为const char[]
,不是 const unsigned char[]
。即使您平台上char
为unsigned
,char
和unsigned char
仍然是不同的类型。如果您的代码段中的第一行是
const char myString[] = "This is my string";
答案 2 :(得分:1)
您应该能够明确地转换为char*
以消除该警告:
size_t size = strlen((char*)tmpBuffer);
或者,由于tmpBuffer
是您所在范围内声明的数组,因此您可以使用sizeof
运算符:
size_t size = sizeof(myString) / sizeof(myString[0]) - 1;