найти количество строк в массиве строк в C - PullRequest
29 голосов
/ 01 марта 2012
char* names[]={"A", "B", "C"};

Есть ли способ узнать количество строк в массиве. Например, в этом случае оно должно быть 3. Пожалуйста, дайте мне знать. Благодаря.

Ответы [ 9 ]

31 голосов
/ 01 марта 2012

В этом случае вы можете разделить общий размер на размер первого элемента:

num = sizeof(names) / sizeof(names[0]);

Осторожно, это работает с массивами . Он не будет работать с указателями.

24 голосов
/ 14 октября 2015

Для массива, которым являются примеры в bounty, достаточно указать sizeof(names)/sizeof(names[0]), чтобы определить длину массива.

Тот факт, что строки в примерах имеют разную длину, не имеет значения,names - это массив char *, поэтому общий размер массива в байтах равен числу элементов в массиве, умноженному на размер каждого элемента (то есть 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]));
}

Вывод:

len 1 = 3
len 2 = 3
len 3 = 4
len 4 = 4
len 5 = 5

РЕДАКТИРОВАТЬ:

Чтобы уточнить, это работает, только если выВы определили массив, т.е. char *names[] или char names[][], и вы находитесь в области, где был определен массив.Если он определен как char **names, у вас есть указатель, который работает как массив, и описанная выше техника не будет работать.Аналогично, если char *names[] является параметром функции, в этом случае массив распадается на адрес первого элемента.

14 голосов
/ 01 марта 2012

Это зависит от того, как создается ваш массив. В C нет способа проверить длину массива, который является указателем, если только он не имеет элемента sentinel или целое число, переданное с массивом как число элементов в массиве. В вашем случае вы можете использовать это:

int namesLen = sizeof(names) / sizeof(char);

Однако, если ваш массив является указателем,

char **names = { "A", "B", "C" };

Вы можете иметь целое число, которое является постоянным для длины массива:

int namesLen = 3;

Или добавить значение часового (например, NULL)

char **names = { "A", "B", "C", NULL };

int namesLen = -1;
while (names[++namesLen] != NULL) { /* do nothing */}

// namesLen is now the length of your array

В качестве другого способа вы можете создать структуру, заполненную желаемыми значениями:

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;
}

И вы бы использовали это так:

struct Array myArray = array("Hi", "There", "This", "Is", "A", "Test");
// use myArray

printf("%i", myArray.length);
destroy(myArray);
7 голосов
/ 19 октября 2015

То, что вы определяете здесь, не буквально массив строк, это массив указателей на символы. если вы хотите узнать количество строк, вам просто нужно сосчитать указатели, что-то вроде

size_t size = sizeof(names)/sizeof(char*);

будет делать, таким образом, вы делите размер массива на размер одного указателя. Но имейте в виду, что это работает, только если размер массива известен во время компиляции (то есть массив выделяется статически) , если он определен динамически (т. е. char ** строки), то sizeof(strings) вернет размер указателя, а не массива.

p.s.: Длина строк не имеет значения, поскольку массив даже не «знает», на что указывают указатели.

2 голосов
/ 01 марта 2012
int count = sizeof(names)/sizeof(*names);

Это принимает общий размер names и делит его на размер одного элемента в names, что дает 3.

1 голос
/ 20 октября 2015

Есть ли способ узнать количество строк в массиве

Конечно, попробуйте это:

#include<stdio.h>

int main(void){
    size_t size, i=0;
    int count=0;
    char* names[]={"A", "B", "C"};

    size = sizeof(names)/sizeof(char*);

    for(i=0;i<size;i++){
        printf("%d - %s\n",count+1, *(names+i));
        count++;
    }

    printf("\n");
    printf("The number of strings found are %d\n",count);
    return 0;
}
1 - A
2 - B
3 - C
The number of strings found are 3

То же с

#include<stdio.h>

size_t arrLength(size_t len, char **arr){
    size_t i=0;
    size_t count=0;

    for(i=0;i<len;i++){
        printf("%zu - %s\n",count+1, *(arr+i));
        count++;
    }

    return count;
}

int main(void){
    char *names[]={"Jimmy", "Tom", "Michael", "Maria", "Sandra", "Madonna"};
    size_t length,size;

    size = sizeof(names)/sizeof(char*);
    length = arrLength(size, names);

    printf("\n");
    printf("The number of strings found are %zu\n",length);
    return 0;
}

Вывод:

1 - Jimmy
2 - Tom
3 - Michael
4 - Maria
5 - Sandra
6 - Madonna
The number of strings found are 6
0 голосов
/ 16 июля 2018

Создание массива строк для запуска в в то время как цикл с оператором приращения, пока цикл не станет NULL , дает размер массива:

#include<stdio.h>
char* names[]={"A", "B", "C"};

int main(){
int nameSize = 0;
while(names[++nameSize]!='\0');
}

for(i=0;i<nameSize;i++){
printf("%s\n", names[i]);
}

return 0;
}

Вывод:

A
B
C
0 голосов
/ 15 октября 2015

найти количество строк в массиве строк в C

Простой способ найти количество объектов в массиве - это взять размер массива, деленный наразмер одного из его элементов.Используйте оператор sizeof, который возвращает размер объекта в байтах.

// For size_t
#include <stddef.h>

char* names[] = { "A", "B", "C" };
size_t number_of_strings = sizeof names / sizeof names[0];

printf("Number of strings %zu\n", number_of_strings);

Важно учитывать, что возвращаемый тип из sizeof равен size_t, целочисленный тип без знака, способный индексировать любой массив, а такжеразмер любого объекта.Чтобы напечатать переменную типа size_t, используйте модификатор z.

0 голосов
/ 18 апреля 2015

Один простой способ вернуть число или строки в массиве - это перебирать массив, пока не закончатся строки.Вот пример.

#include <stdio.h>

int main()
{
    char* names[] = {"John", "Paul", "George", "Ringo", '\0'};

    int size = 0;
    while(names[++size]!='\0');

    printf("Size: %d\n", size); // Prints "4"

    return 0;
}

Этот метод имеет преимущество в том, что он работает , даже если строки имеют разную длину .Обратите внимание на завершающий байт NULL в массиве names и символ ; для закрытия оператора while, так как нет тела оператора для выполнения.

...