1

在不使用类似这样的 cstdlib 的情况下,如何获得字符串文字的长度(给定或取空终止符):

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

我必须在连接中可能/可能不包含字符串文字的字符串上重载 + 运算符。在不知道传递的 char*(Or char[] 我猜) 的长度的情况下,我无法为字符串分配内存。

4

6 回答 6

6

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

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

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

但是,您可以在使用数组时知道大小:

char foo[] = "some string";
size_t len = sizeof(foo) - 1;
于 2013-02-26T23:23:28.890 回答
3
#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; 
}
于 2013-02-26T23:22:30.930 回答
1

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

char foo[] = "foobar";

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

于 2013-02-26T23:32:29.803 回答
0

您看到所获得值的原因很明显:

foo是一个指针,并且指针通常是 4 个字节长。*foo是一个字符,一个字节长。如果你不能使用内置库,你可以自己动手:

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

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

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

如果您在那里找到字符串长度,我不会感到惊讶。

于 2013-02-26T23:27:48.803 回答
0

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

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;
}
于 2021-11-23T19:31:19.333 回答
-1

使用std::string

#include <string>

int main()
{
    std::string str("Hello World");

    std::cout << str.length(); // 11
}
于 2013-02-26T23:30:07.170 回答