char* names[]={"A", "B", "C"};
Есть ли способ найти количество строк в массиве. Например, в этом случае это должно быть 3. Пожалуйста, дайте мне знать. Спасибо.
char* names[]={"A", "B", "C"};
Есть ли способ найти количество строк в массиве. Например, в этом случае это должно быть 3. Пожалуйста, дайте мне знать. Спасибо.
В этом случае вы можете разделить общий размер на размер первого элемента:
num = sizeof(names) / sizeof(names[0]);
Осторожно, но это работает с массивами. Он не будет работать с указателями.
Для массива, примером которого являются примеры в баунти, выполнение 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]));
}
Вывод:
len 1 = 3
len 2 = 3
len 3 = 4
len 4 = 4
len 5 = 5
EDIT:
Чтобы уточнить это, это работает, только если вы определили массив, т.е. char *names[]
или char names[][]
, и вы находитесь в области, где был определен массив. Если он определен как char **names
, тогда у вас есть указатель, который функционирует как массив, и вышеупомянутый метод не будет работать. Аналогично, если char *names[]
является параметром функции, в этом случае массив распадается на адрес первого элемента.
Это зависит от того, как создается ваш массив. В C нет возможности проверить длину массива, который является указателем, если у него нет элемента-дозорника, или целое число, переданное с массивом, как количество элементов в массиве. В вашем случае вы можете использовать это:
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);
То, что вы определяете здесь, не буквально представляет собой массив строк, это массив указателей на символы. если вы хотите знать количество строк, вам просто нужно подсчитать указатели, поэтому что-то вроде
size_t size = sizeof(names)/sizeof(char*);
так вы разделите размер массива на размер одного указателя. Но имейте в виду, что это работает только в том случае, если размер массива известен во время компиляции (т.е. массив распределяется статически), если он задан динамически (т.е. char ** строки), тогда sizeof(strings)
вернет размер указателя, а не массив.
p.s.: длина строк не имеет значения, поскольку массив даже не "осведомлен" о том, что указывают указатели.
int count = sizeof(names)/sizeof(*names);
Это принимает общий размер names
и делит его на размер одного элемента в names
, в результате получается 3.
Есть ли способ найти количество строк в массиве
Конечно, есть, попробуйте следующее:
#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>
int main(void){
size_t size, i=0;
int count=0;
char *names[]={"Jimmy", "Tom", "Michael", "Maria", "Sandra", "Madonna"};
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 - Jimmy 2 - Tom 3 - Michael 4 - Maria 5 - Sandra 6 - Madonna
The number of strings found are 6
Или используйте функцию вроде этого:
#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
Один простой способ вернуть число или строки в массиве - перебрать массив, пока не закончится строка. Вот пример.
#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
, поскольку не существует тела оператора, который будет запущен.
Чтобы найти количество символов в строковом массиве, вы можете прокручивать элементы массива и в каждом цикле индекса через содержимое элемента (или строку), пока не нажмете "\ 0". Следующий код делает это и работает с любым размером строк, хранящихся в массиве
char* names[] = {"An", "Bed", "Cards"};
int arrayIndex, counter;
for (arrayIndex = 0; arrayIndex < (sizeof(names)/sizeof(char*)); arrayIndex++) {
//counting also chars in each string (extra, not necessarily the question)
char* stringAtIndex = names[arrayIndex];
char c;
int i = 0;
do {
c = *(stringAtIndex + i++);
} while (c != '\0');
counter += (i-1); //exclude terminating char '\0'
}
printf("Number of array elements: %d", arrayIndex+1); //number of strings
printf("Total chars %d\n", counter); // Prints 10 which is number of chars excluding '\0'
найти количество строк в массиве строк в 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);
Важно учитывать, что тип return из sizeof
- это size_t
, целочисленный тип без знака, способный индексировать любой массив, а также размер любого объекта. Чтобы напечатать переменную типа size_t
, используйте модификатор z
.
Заставить Array Of Strings запускаться в цикле While с оператором инкремента, пока цикл не станет равным 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