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

时间:2013-02-26 23:21:00

标签: c++ string sizeof literals

如果不使用类似这样的cstdlib,你将如何获得字符串文字的长度(给出或取空终止符):

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

我必须在字符串上重载+运算符,该字符串可能/可能不包含串联中的字符串文字。我不知道为字符串分配内存而不知道char *的长度(或者我猜的是char [])。

5 个答案:

答案 0 :(得分: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; 
}

答案 1 :(得分:3)

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

特别是,char指针(foo)的大小是4个字节(在32位系统上[好,一个有4个字节指针的系统]),以及char的大小({{1 }}是1个字节。

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

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

*foo

答案 2 :(得分:0)

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

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

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

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

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

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

答案 3 :(得分:0)

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

char foo[] = "foobar";

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

答案 4 :(得分:-1)

使用std::string

#include <string>

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

    std::cout << str.length(); // 11
}