考虑以下数组"字符串"在C:
const char* const animals[] =
{
"",
"Cat",
"Dawg",
"Elephant",
"Tiger",
};
是否有可能获得:
animals
数组中的元素数量(字符指针)?
每个阵列成员的长度,即。元素0的size = 1,元素1的size = 4,依此类推?
我当然尝试使用sizeof
,但它似乎没有返回任何有意义的东西。我认为预编译器应该可以计算出数组中元素的数量以及每个元素的大小。对于后者,人们可以搜索\0
字符以及定义长度。我想知道为什么在使用animals
时我无法获得正确的数组大小(即sizeof
数组中的元素数量)?
我很感激所有建议。
编辑:
是的,我的意思是预处理器,而不是预编译器,抱歉。
为什么需要此功能? 我正在从串口解析传入的字符串。我需要弄清楚收到的字符串是否与我预先配置的表中的任何字符串匹配。如果是,我需要该项目的索引。我需要搜索算法快速。因此,我首先要检查字符串大小和之后的所有字节,仅当大小匹配时。因此,我认为在编译时可能知道每个字符串的长度。
这是我目前的检查功能:
static int32_t getStringIndex(const uint8_t* const buf, const uint32_t len)
{
if (!len)
return -1;
int32_t arraySize = sizeof(animals) / sizeof(animals[0]);
uint32_t elementSize;
// The algorithm 1st checks if the length matches. If yes, it compares the strings.
for (int32_t i = 0; i < arraySize; i++)
{
elementSize = strlen(animals[i]);
if (elementSize == len)
{
if (0 == memcmp(animals[i], buf, len))
{
return i;
}
}
}
return -1;
}
我不使用strcmp
,因为buf
最后没有\0
。
答案 0 :(得分:2)
sizeof animals / sizeof *animals
(字母总大小除以单个元素的大小)
strlen(animals[0]) + 1
(字符串长度不包含0
终结符)
答案 1 :(得分:2)
sizeof animals / sizeof animals[0]
返回数组中元素的数量。
此外,您还可以使用strlen()
来获取数组中每个元素的长度。
来自标准§7.24.6.3
strlen
函数返回前面的字符数 终止空字符。
sizeof
也是运营商。
来自标准§6.5.3.4
sizeof
运算符的另一个用途是计算数量array
中的元素:
sizeof array / sizeof array[0]
答案 2 :(得分:1)
您可以使用预处理器来构建包含长度的结构数组和指向字符串的指针,如下所示:
profile
输出将是:
#include <stdio.h>
struct animalentry
{
int size;
const char* const name;
};
#define ANIMAL_ENTRY(a) { sizeof a - 1, a },
const struct animalentry animals[] =
{
ANIMAL_ENTRY("")
ANIMAL_ENTRY("Cat")
ANIMAL_ENTRY("Dawg")
ANIMAL_ENTRY("Tiger")
};
int main()
{
for (int i = 0; i < sizeof animals / sizeof animals[0]; i++)
{
printf("Name = %s, length = %d\n", animals[i].name, animals[i].size);
}
}
这应该很容易适应您的Name = , length = 0
Name = Cat, length = 3
Name = Dawg, length = 4
Name = Tiger, length = 5
功能。