给定一个指向字符串文字的指针数组:
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 + ' ')
通过使用元素的边界来确定大小。 第一个元素的开头和第二个元素的开头之间的空间是第一个元素的大小。
这包括终止