获取字符串文字的字符长度

Getting the character length of a string literal

本文关键字:字符 字符串 文字 获取      更新时间:2023-10-16

如果不使用以下内容的cstdlib,如何获得字符串文字的长度(给定或接受null终止符(:

char* foo = "foobar";
cout << sizeof(foo) << endl; //Always outputs 4
cout << sizeof(*foo) << endl; //Always outputs 1

我必须重载字符串上的+运算符,该字符串可能/可能不包括串联中的字符串文字。如果不知道传递的char*(或者char[](的长度,我就无法为字符串分配内存。

foo是一个指向字符串的指针。是的,它是一个常量字符串,但在一天结束时它仍然是一个char*

特别地,字符指针(foo(的大小是4字节(在32位系统上[嗯,具有4字节指针的系统](,并且字符(*foo(的大小为1字节。

当您使用指向字符串文字的指针时,没有(标准(方法可以知道字符串的长度。

然而,当您使用数组时,您可以知道其大小:

char foo[] = "some string";
size_t len = sizeof(foo) - 1;
#include <cstring>
std::size_t length = std::strlen(foo);

编辑如果由于任何原因无法使用任何库,则推出您自己的strlen。例如

// simple recursion
size_t mystrlen1(const char* str)
{
  return (*str) ? 1 + mystrlen1(++str) : 0;
}

// iteration
size_t mystrlen_iteration(const char* str)
{
  size_t counter = 0;
  for (;*str!=0; ++str) ++counter;
  return counter; 
}

sizeof(char*(是指向字符串的指针的大小。你可以试试

char foo[] = "foobar";

sizeof(foo(=7(因为它是"foobar\0"-以null结尾的字符串(

如果我们不想要标准库字符串,我们可能会使用结构。

struct ConstStr
{
   const size_t length;
};
struct ConstStr operator ""cstr (const char*given, size_t given_size) { return {given_size-1}; }

使用字符串文字运算符重载,我们可以获得大小。

int main()
{
   auto str = "Hello world"cstr;
   cout << str.length << std::endl;
}

使用std::string:

#include <string>
int main()
{
    std::string str("Hello World");
    std::cout << str.length(); // 11
}

您看到所获得的值的原因是显而易见的:

foo是一个指针,指针通常为4字节长。*foo是一个字符,长度为一个字节。如果你不能使用内置库,你可以推出自己的:

function myStrlen(char* foo) {
    int ii=0;
    while(foo[ii]!='') ii++;
    return ii;
}

我有一个有趣的想法,大多数编译器通过将值存储在(pointer-1(中来记录分配内存块的大小——这就是free((知道释放多少内存的方式。我不知道这是否普遍成立,也不知道字符串常量是否成立,但我过去已经成功地使用了这一点。是的,我是个黑客。。。在你的情况下,我会仔细看一眼

*(((unsigned long int*)foo) - 1)

如果你在那里找到绳子的长度,我不会感到惊讶。