17

给定一个指向字符串字面量的指针数组:

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]);

但结果似乎是数组中指针的数量,而不是字符串文字的长度。

4

7 回答 7

24

如果您希望在编译时计算数字(而不是在运行时使用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.

于 2012-09-22T09:18:11.890 回答
19

我的建议是使用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。

不要浪费时间执行编译器可以为您做的优化!

于 2014-01-11T20:41:27.503 回答
1

strlen为您提供字符串的长度,而sizeof将返回您作为参数输入的数据类型的大小(以字节为单位)。

斯特伦

大小

于 2012-09-22T08:34:02.787 回答
0

strlen也许?

size_t size = strlen(textMessages[2]);
于 2012-09-22T07:30:10.427 回答
0

您应该使用strlen()库方法来获取字符串的长度。 sizeof将为您提供一个指针的大小textMessages[2],该指针取决于机器(4 个字节或 8 个字节)。

于 2012-09-22T07:30:34.123 回答
0

您可以利用数组中的值是连续的这一事实:

const char *messages[] = {
    "footer",
    "barter",
    "banger"
};

size_t sizeOfMessage1 = (messages[1] - messages[0]) / sizeof(char); // 7   (6 chars + '\0')

大小是通过使用元素的边界来确定的。第一个元素的开头和第二个元素的开头之间的空间是第一个元素的大小。

这包括终止\0. 当然,该解决方案仅适用于常量字符串。如果字符串是指针,您将获得指针的大小而不是字符串的长度。

这不能保证有效。如果字段对齐,这可能会产生错误的大小,并且编译器可能会引入其他警告,例如合并相同的字符串。此外,您的数组中至少需要两个元素。

于 2012-09-22T12:46:18.343 回答
-1

我会告诉你一些事情,根据我的知识数组,指针是一样的,除非你使用sizeof.

当您sizeof在指针上使用时,无论指针指向什么,它都将始终返回4 BYTE,但如果它在数组上使用,它将返回数组多长(以字节为单位)?.

在您的示例中,这里*textMessage[]是指针数组,因此当您使用sizeof(textMessage[2])它时,它将返回4 BYTE,因为textMessage[2]它是一个指针。

我希望它对你有用。

于 2012-09-22T12:17:08.413 回答