在C中查找字符串数组中的字符串数

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)

但是要小心,这适用于数组.它不适用于指针.

  • 许多代码库将其定义为一个宏,例如:#define ARRAY_SIZE(x) ( sizeof(x) / sizeof((x)[0]) ) (3认同)

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[]是函数参数,则在这种情况下,数组衰减到第一个元素的地址.

  • 谢谢。你给出的解释非常好,这是关键。我认为根据解释,cnicutar 的答案应该是_接受的答案_,因为它给出了相同的答案但没有解释,但到目前为止这个答案是赏金的主要候选者。谢谢。 (2认同)

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)

  • 您应该除以 sizeof(char *) 或 sizeof(*names),而不是 sizeof(char) (3认同)

has*_*fat 7

你在这里定义的不是字面上的字符串数组,它是一个字符指针数组.如果你想知道字符串的数量,你只需要计算指针,就像这样

size_t size = sizeof(names)/sizeof(char*);
Run Code Online (Sandbox Code Playgroud)

会这样做,这样你就可以将数组的大小除以单个指针的大小.但要注意,只有在编译时知道数组的大小(即数组是静态分配的)时,这才有效,如果它是动态定义(即char**字符串)然后sizeof(strings)返回指针的大小而不是数组.

ps:字符串的长度不相关,因为数组甚至"不知道"指针指向的内容.