【发布时间】:2017-11-17 08:02:08
【问题描述】:
考虑以下 C 语言中的“字符串”数组:
const char* const animals[] =
{
"",
"Cat",
"Dawg",
"Elephant",
"Tiger",
};
是否可以获得:
animals数组中元素(字符指针)的数量?每个数组成员的长度,即。元素 0 的 size = 1,元素 1 的 size = 4 等等?
我当然尝试使用sizeof,但它似乎没有返回任何有意义的东西。我认为预编译器应该可以计算出数组中元素的数量以及每个元素的大小。对于后者,也可以搜索\0 字符并定义长度。但是我想知道为什么在使用sizeof 时无法获得正确的数组大小(即animals 数组中的元素数)?
感谢所有建议。
编辑:
是的,我指的是预处理器,而不是预编译器,抱歉。
为什么我需要这个功能? 我正在解析来自串行端口的传入字符串。我需要弄清楚接收到的字符串是否与我的预配置表中的任何字符串匹配。如果是这样,我需要该项目的索引。我需要快速的搜索算法。因此,我首先要检查字符串大小和之后的所有字节,前提是大小匹配。因此,我认为每个字符串的长度可能在编译时是已知的。
这是我目前的检查功能:
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。
【问题讨论】:
-
您可以使用
sizeof(animals)/sizeof(*animals)来获取动物的数量(包括您可能不应该拥有的最初的“空”动物)。您可以使用strlen(animals[i])获取各个动物名称的长度。 -
没有预编译器之类的东西。如果您的意思是预处理器,那么答案是否定的。预处理器只进行文本替换,它对变量的大小一无所知。也许你应该告诉我们为什么你需要知道这一点。你的用例是什么?
-
我已经编辑了我的问题。
-
您可以在程序初始化期间一劳永逸地计算
animals中字符串的长度,因此您无需一遍又一遍地调用strlen。我认为您无法获得数组中字符串文字的长度(例如,sizeof(animals[2])不是字符串的长度,而是指针的大小)。 -
其实这是个好主意。
标签: c arrays pointers char size