确定字符串文字的长度
给定一个指向字符串文字的指针数组:
char *textMessages[] = { "Small text message", "Slightly larger text message", "A really large text message that " "is spread over multiple lines" }
如何确定特定字符串文字的长度 – 比如第三个? 我尝试使用sizeof命令如下:
int size = sizeof(textMessages[2]);
但结果似乎是数组中指针的数量,而不是字符串文字的长度。
如果你想要在编译时计算的数字(而不是在运行时使用strlen
),那么使用像这样的表达式是完全可以的
sizeof "A really large text message that " "is spread over multiple lines";
您可能希望使用宏来避免重复长文字,但是:
#define LONGLITERAL "A really large text message that " \ "is spread over multiple lines"
请注意, sizeof
返回的值包括终止NUL,因此不仅仅是strlen
。
我的建议是使用strlen并打开编译器优化。
例如,在x86上使用gcc 4.7:
#include static const char *textMessages[3] = { "Small text message", "Slightly larger text message", "A really large text message that " "is spread over multiple lines" }; size_t longmessagelen(void) { return strlen(textMessages[2]); }
运行make CFLAGS="-ggdb -O3" example.o
:
$ gdb example.o (gdb) disassemble longmessagelen 0x00000000 <+0>: mov $0x3e,%eax 0x00000005 <+5>: ret
即编译器已将对strlen
的调用替换为常量值0x3e = 62。
不要浪费时间执行编译器可以为您做的优化!
strlen
也许?
size_t size = strlen(textMessages[2]);
您应该使用strlen()
库方法来获取字符串的长度。 sizeof
将为您提供textMessages[2]
的大小,这是一个指针,它取决于机器(4个字节或8个字节)。
strlen为您提供字符串的长度,而sizeof将返回您作为参数输入的字节数据类型的大小。
strlen的
的sizeof
你可以利用这个事实,即数组中的值是连续的:
const char *messages[] = { "footer", "barter", "banger" }; size_t sizeOfMessage1 = (messages[1] - messages[0]) / sizeof(char); // 7 (6 chars + '\0')
通过使用元素的边界来确定大小。 第一个元素的开头和第二个元素的开头之间的空间是第一个元素的大小。
这包括终止\0
。 当然,解决方案仅适用于常量字符串。 如果字符串是指针,你将获得指针的大小而不是字符串的长度。
这不能保证有效 。 如果字段是对齐的,这可能会产生错误的大小,编译器可能会引入其他警告,例如合并相同的字符串。 此外,您的arrays中至少需要两个元素。
我会告诉你一些事情,根据我的知识数组,指针是相同的, 除非你使用sizeof
。
当你在指针上使用sizeof
,无论指针指向什么东西,它都会返回4 BYTE ,但是如果它在数组上使用它将返回数组大小的字节数? 。
在你的示例中*textMessage[]
是指针数组,因此当您使用sizeof(textMessage[2])
,它将返回4 BYTE,因为textMessage[2]
是一个指针。
我希望它对你有用。