use*_*265 31 c arrays string numbers
char* names[]={"A", "B", "C"};
Run Code Online (Sandbox Code Playgroud)
有没有办法找到数组中的字符串数量.例如,在这种情况下,它必须是3.请让我知道.谢谢.
cni*_*tar 33
在这种情况下,您可以将总大小除以第一个元素的大小:
num = sizeof(names) / sizeof(names[0]);
Run Code Online (Sandbox Code Playgroud)
但是要小心,这适用于数组.它不适用于指针.
dbu*_*ush 26
对于一个数组,赏金中的例子sizeof(names)/sizeof(names[0])就足以确定数组的长度.
示例中的字符串具有不同长度的事实并不重要. names是一个数组char *,所以数组的总大小(以字节为单位)是数组中元素的数量乘以每个元素的大小(即a char *).这些指针中的每一个都可以指向任何长度的字符串,或者指向NULL.无所谓.
测试程序:
#include<stdio.h>
int main(void)
{
char* names1[]={"A", "B", "C"}; // Three elements
char* names2[]={"A", "", "C"}; // Three elements
char* names3[]={"", "A", "C", ""}; // Four elements
char* names4[]={"John", "Paul", "George", "Ringo"}; // Four elements
char* names5[]={"", "B", NULL, NULL, "E"}; // Five elements
printf("len 1 = %zu\n",sizeof(names1)/sizeof(names1[0]));
printf("len 2 = %zu\n",sizeof(names2)/sizeof(names2[0]));
printf("len 3 = %zu\n",sizeof(names3)/sizeof(names3[0]));
printf("len 4 = %zu\n",sizeof(names4)/sizeof(names4[0]));
printf("len 5 = %zu\n",sizeof(names5)/sizeof(names5[0]));
}
Run Code Online (Sandbox Code Playgroud)
输出:
len 1 = 3
len 2 = 3
len 3 = 4
len 4 = 4
len 5 = 5
Run Code Online (Sandbox Code Playgroud)
编辑:
为了澄清,这只有在您定义了数组时才有效,即,char *names[]或者您在定义数组char names[][]的范围内.如果它被定义为char **names那么你有一个指针作为一个数组,上述技术将无法工作.类似地,如果char *names[]是函数参数,则在这种情况下,数组衰减到第一个元素的地址.
Ric*_*III 14
这取决于您的阵列的创建方式.在C中,没有办法检查作为指针的数组的长度,除非它有一个sentinel元素,或者一个整数与数组一起传递作为数组中元素的计数.在您的情况下,您可以使用此:
int namesLen = sizeof(names) / sizeof(char);
Run Code Online (Sandbox Code Playgroud)
但是,如果您的数组是指针,
char **names = { "A", "B", "C" };
Run Code Online (Sandbox Code Playgroud)
你可以有一个整数,对于数组的长度是常量:
int namesLen = 3;
Run Code Online (Sandbox Code Playgroud)
或者添加一个标记值(例如NULL)
char **names = { "A", "B", "C", NULL };
int namesLen = -1;
while (names[++namesLen] != NULL) { /* do nothing */}
// namesLen is now the length of your array
Run Code Online (Sandbox Code Playgroud)
换句话说,您可以创建一个充满所需值的结构:
struct Array {
void **values;
int length;
};
#define array(elements...) ({ void *values[] = { elements }; array_make(values, sizeof(values) / sizeof(void *)); })
#define destroy(arr) ({ free(arr.values); })
struct Array array_make(void **elements, int count)
{
struct Array ret;
ret.values = malloc(sizeof(void *) * count);
ret.length = count;
for (int i = 0; i < count; i++) {
ret.values[i] = elements[i];
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
你会这样使用它:
struct Array myArray = array("Hi", "There", "This", "Is", "A", "Test");
// use myArray
printf("%i", myArray.length);
destroy(myArray);
Run Code Online (Sandbox Code Playgroud)
你在这里定义的不是字面上的字符串数组,它是一个字符指针数组.如果你想知道字符串的数量,你只需要计算指针,就像这样
size_t size = sizeof(names)/sizeof(char*);
Run Code Online (Sandbox Code Playgroud)
会这样做,这样你就可以将数组的大小除以单个指针的大小.但要注意,只有在编译时知道数组的大小(即数组是静态分配的)时,这才有效,如果它是动态定义(即char**字符串)然后sizeof(strings)返回指针的大小而不是数组.
ps:字符串的长度不相关,因为数组甚至"不知道"指针指向的内容.