给出一个指向字符串文字的指针数组:
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]);
但结果似乎是数组中指针的数量,而不是字符串文字的长度。
答案 0 :(得分:19)
如果你想要在编译时计算的数字(而不是在运行时使用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
以上。
答案 1 :(得分:16)
我的建议是使用 strlen 并启用编译器优化。
例如,在x86上使用gcc 4.7:
#include <string.h>
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。
不要浪费时间执行编译器可以为您做的优化!
答案 2 :(得分:0)
strlen
也许?
size_t size = strlen(textMessages[2]);
答案 3 :(得分:0)
您应该使用strlen()
库方法来获取字符串的长度。 sizeof
会给你一个textMessages[2]
的大小,一个指针,它与机器有关(4个字节或8个字节)。
答案 4 :(得分:0)
答案 5 :(得分:0)
你可以利用这样一个事实,即数组中的值是连续的:
const char *messages[] = {
"footer",
"barter",
"banger"
};
size_t sizeOfMessage1 = (messages[1] - messages[0]) / sizeof(char); // 7 (6 chars + '\0')
通过使用元素的边界来确定大小。第一个元素的开头和第二个元素的开头之间的空格是第一个元素的大小。
这包括终止\0
。当然,解决方案仅适用于常量字符串。如果字符串是指针,你将获得指针的大小而不是字符串的长度。
无法保证无法正常使用。如果字段是对齐的,这可能会产生错误的大小,并且编译器可能会引入其他警告,例如合并相同的字符串。 此外,您的阵列中至少需要两个元素。
答案 6 :(得分:-1)
我会告诉你一些事情,根据我的知识数组,当你使用sizeof
时,指针与相同。
当你在指针上使用sizeof
时,它将始终返回 4 BYTE ,无论指针指向什么,但如果它在数组上使用它将返回数组是大字节?。
在您的示例中,*textMessage[]
是指针数组,因此当您使用sizeof(textMessage[2])
时,它将返回 4 BYTE ,因为textMessage[2]
是指针。
我希望它对你有用。