获取字符串文字的字符长度
Getting the character length of a string literal
如果不使用以下内容的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)
如果你在那里找到绳子的长度,我不会感到惊讶。
相关文章:
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 将 NULL 与 C 的字符* 字符串一起使用
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 无法将常量字符字符串传递给模板类
- 如何组合一个宽字符字符串,中间插入一些空字符
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 从给定索引返回子字符字符串的函数
- 字符 [](c 字符串)的初始化标准
- 如何将字符字符串用作数学运算符
- 将 Unicode 字符/字符串写入文件
- C++,字符* 字符串修改
- 如何有效地用不同的整数元素替换字符字符串的元素
- C++:如果我们在字符串中添加一些整数,为什么它会从开头删除该数量的字符?(字符串 + 整数)
- strcpy正在复制sth字符i字符串.如何解决此错误
- 在C++中将双精度转换为字符*/字符串
- C 中的宽字符字符串
- 如何提取C 中的字符/字符串之间的字符串
- 无法将字符/字符串转换为int
- 带有指针的反转字符字符串
- 反转字符串中的 n 个字符(字符串中没有空格),而不使用 c++ 中的内置函数