如果不使用类似这样的cstdlib,你将如何获得字符串文字的长度(给出或取空终止符):
char* foo = "foobar";
cout << sizeof(foo) << endl; //Always outputs 4
cout << sizeof(*foo) << endl; //Always outputs 1
我必须在字符串上重载+运算符,该字符串可能/可能不包含串联中的字符串文字。我不知道为字符串分配内存而不知道char *的长度(或者我猜的是char [])。
答案 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
}