C 找出字符串数组长度和每个字符串的长度
考虑C中的以下“字符串”数组: 是否有可能获得:C 找出字符串数组长度和每个字符串的长度,c,arrays,pointers,char,size,C,Arrays,Pointers,Char,Size,考虑C中的以下“字符串”数组: 是否有可能获得: animals数组中的元素数(字符指针) 每个数组成员的长度,即元素0的大小=1,元素1的大小=4,依此类推 当然,我试过使用sizeof,但它似乎没有返回任何有意义的结果。我认为预编译器应该能够计算出数组中元素的数量以及每个元素的大小。对于后者,还可以定义\0字符的长度。但是,我想知道为什么在使用sizeof时,我无法获得正确的数组大小(即animals数组中的元素数) 我将感谢所有建议 编辑: 是的,我是说预处理器,不是预编译器,对不起 为什
animals
数组中的元素数(字符指针)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;
}
static int32\u t getStringIndex(const uint8\u t*const buf,const uint32\u t len)
{
如果(!len)
返回-1;
int32_t arraySize=sizeof(动物)/sizeof(动物[0]);
uint32_t元素大小;
//算法首先检查长度是否匹配。如果匹配,则比较字符串。
对于(int32_t i=0;i
我不使用strcmp,因为buf
末尾没有\0
sizeof animals/sizeof*animals
(总大小(字节)除以单个元素的大小)strlen(动物[0])+1
(字符串长度不包括0
终止符)sizeof animals/sizeof*animals
(总大小(字节)除以单个元素的大小)strlen(动物[0])+1
(字符串长度不包括0
终止符)strlen()
获取数组中每个元素的长度
来自标准第7.24.6.3节
strlen
函数返回前面的字符数
终止的空字符
另外,sizeof
是一个运算符
来自标准第6.5.3.4节
sizeof
运算符的另一个用途是计算
数组中的元素
:
返回数组中的元素数
您还可以使用strlen()
获取数组中每个元素的长度
来自标准第7.24.6.3节
strlen
函数返回前面的字符数
终止的空字符
另外,sizeof
是一个运算符
来自标准第6.5.3.4节
sizeof
运算符的另一个用途是计算
数组中的元素
:
您可以使用预处理器构建包含长度和字符串指针的结构数组,如下所示:
#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);
}
}
这应该很容易适应您的
getStringIndex
函数。您可以使用预处理器构建一个包含长度和字符串指针的结构数组,如下所示:
#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);
}
}
这应该很容易适应您的
getStringIndex
功能。您可以使用sizeof(动物)/sizeof(*动物)
获取动物数量(包括您可能不应该拥有的初始“空”动物)。您可以使用strlen(动物[i])
获取单个动物名称的长度。没有预编译程序。如果你指的是预处理器,那么答案是否定的。预处理器只做文本替换,它不知道变量的大小。也许你应该告诉我们为什么你需要知道。您的用例是什么?我已经编辑了我的问题。您可以在程序初始化期间一次性地计算animals
中字符串的长度,因此您不需要反复调用strlen
。我认为你不能得到数组中字符串文字的长度(例如,sizeof(animals[2])
不是strig的长度,而是指针的大小)。实际上这是个好主意。你可以使用sizeof(animals)/sizeof(*animals)
来获得动物的数量(包括首字母“empty”)你可能不应该拥有的动物)。您可以使用strlen(动物[i])
获取单个动物名称的长度。没有预编译程序。如果你指的是预处理器,那么答案是否定的。预处理器只做文本替换,它不知道变量的大小。也许你应该告诉我们为什么你需要知道。您的用例是什么?我已经编辑了我的问题。您可以在程序初始化期间一次性地计算animals
中字符串的长度,因此您不需要反复调用strlen
。我认为您无法获得数组中字符串文字的长度(例如,sizeof(animals[2])
不会是长度
sizeof array / sizeof array[0]
#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