获取无符号字符指针长度的正确方法

Aru*_*run 1 c compiler-warnings

我正在使用 strlen 函数来获取无符号字符指针的长度。但是 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 *'
Run Code Online (Sandbox Code Playgroud)

那么获取无符号字符指针大小以消除警告的正确方法是什么。

use*_*738 5

strlen((const char*)tmpBuffer);
Run Code Online (Sandbox Code Playgroud)

让你摆脱笔记。在这里,您将其类型转换为期望的适当类型strlen()

标准来看,函数的原型是

size_t strlen(const char *s);
Run Code Online (Sandbox Code Playgroud)

但是在这里你传递了它的类型unsigned char*,这就是抱怨的原因。

此外,如果您使用它来简单地存储字符串,如示例所示。您可以char毫无问题地使用。


Bat*_*eba 5

使用strlen是 O(1) 问题的 O(N) 解决方案!

数组的大小在编译时是已知的。使用习语sizeof(myString)。这是包括NUL 终止符的长度,因此将比strlen结果大 1。

当然,sizeof如果数组已衰减为指针类型,则不能使用获取长度。在这种情况下,您可以通过使用强制转换来消除编译器警告const char*

size_t size = strlen((const char*)tmpBuffer);
Run Code Online (Sandbox Code Playgroud)

注意 NUL 终止符包括在计数中。

由于代码中的一个奇怪之处,因此需要强制转换。字符串文字const char[]在 C 中是 of ,而不是 const unsigned char[]. 即使charunsigned你的平台上,char并且unsigned char仍然是不同的类型。如果您的代码段中的第一行是

const char myString[] = "This is my string";
Run Code Online (Sandbox Code Playgroud)