char* names[]={"A", "B", "C"};
Existe-t-il un moyen de trouver le nombre de chaînes dans le tableau ? Par exemple, dans ce cas, le résultat devrait être le suivant : 3.
char* names[]={"A", "B", "C"};
Existe-t-il un moyen de trouver le nombre de chaînes dans le tableau ? Par exemple, dans ce cas, le résultat devrait être le suivant : 3.
De nombreuses bases de code définissent cela comme une macro du type : #define ARRAY_SIZE(x) ( sizeof(x) / sizeof((x)[0]) )
Cette réponse devrait être la réponse acceptée. C'était la première réponse, et elle est correcte. Cela dit, la générosité Je récompense la première réponse qui explique pourquoi cela fonctionne.
J'ai essayé sizeof avec mon tableau array[]={".A.", "..B", ".C.", ".D.", "..E",} J'obtiens le compte 3 sur 5 ..... avec sizeof AND strlen
Pour un tableau, ce qui est le cas des exemples de la prime, faire sizeof(names)/sizeof(names[0])
est suffisante pour déterminer la longueur du tableau.
Le fait que les cordes dans les exemples soient de longueur différente n'a pas d'importance. names
est un tableau de char *
La taille totale du tableau en octets est donc égale au nombre d'éléments du tableau multiplié par la taille de chaque élément (c'est-à-dire a char *
). Chacun de ces pointeurs peut pointer vers une chaîne de caractères de n'importe quelle longueur, ou vers NULL. Cela n'a pas d'importance.
Programme de test :
#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]));
}
Sortie :
len 1 = 3
len 2 = 3
len 3 = 4
len 4 = 4
len 5 = 5
EDIT :
Pour clarifier, ceci ne fonctionne que si vous avez défini un tableau, c'est à dire char *names[]
o char names[][]
et vous êtes dans la portée où le tableau a été défini. S'il est défini comme char **names
alors vous avez un pointeur qui fonctionne comme un tableau et la technique ci-dessus ne fonctionnera pas. De même, si char *names[]
est un paramètre de fonction, auquel cas le tableau se désintègre à l'adresse du premier élément.
Nous vous remercions. L'explication que vous donnez est excellente, et c'est la clé. Je suppose que, sur la base de l'explication, la réponse de cnicutar devrait être la suivante réponse acceptée Cette réponse est pour l'instant la principale candidate à la prime. Je vous remercie de votre attention.
Cela dépend de la façon dont votre tableau est créé. En C, il n'y a aucun moyen de vérifier la longueur d'un tableau qui est un pointeur, à moins qu'il n'ait un élément sentinelle, ou un entier passé avec le tableau comme un compte des éléments dans le tableau. Dans votre cas, vous pourriez utiliser ceci :
int namesLen = sizeof(names) / sizeof(char);
Cependant, si votre tableau est un pointeur,
char **names = { "A", "B", "C" };
Vous pouvez soit avoir un nombre entier constant pour la longueur du tableau :
int namesLen = 3;
Ou ajouter une valeur sentinelle (par exemple NULL)
char **names = { "A", "B", "C", NULL };
int namesLen = -1;
while (names[++namesLen] != NULL) { /* do nothing */}
// namesLen is now the length of your array
D'une autre manière, vous pourriez créer une structure remplie des valeurs que vous souhaitez :
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;
}
Et vous l'utiliseriez comme tel :
struct Array myArray = array("Hi", "There", "This", "Is", "A", "Test");
// use myArray
printf("%i", myArray.length);
destroy(myArray);
Ce que vous définissez ici n'est pas littéralement un tableau de chaînes de caractères, c'est un tableau de pointeurs vers des caractères. Si vous voulez connaître le nombre de chaînes de caractères, vous devez simplement compter les pointeurs, donc quelque chose comme
size_t size = sizeof(names)/sizeof(char*);
Mais attention, cela ne fonctionne que si la taille du tableau est connue au moment de la compilation (c'est-à-dire si le tableau est alloué de manière statique), s'il est défini de manière dynamique (par exemple les chaînes de caractères char**) alors sizeof(strings)
retournerait la taille du pointeur et non du tableau.
p.s. : la longueur des chaînes n'est pas pertinente, puisque le tableau n'est même pas "conscient" de ce vers quoi pointent les pointeurs.
Y a-t-il un moyen de trouver le nombre de chaînes dans un tableau ?
Bien sûr que si, essayez ça :
#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
Même chose avec :
#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;
}
Sortie :
1 - Jimmy 2 - Tom 3 - Michael 4 - Maria 5 - Sandra 6 - Madonna
The number of strings found are 6
Ou utilisez une fonction comme celle-ci :
#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;
}
Sortie :
1 - Jimmy 2 - Tom 3 - Michael 4 - Maria 5 - Sandra 6 - Madonna
The number of strings found are 6
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
2 votes
Il s'agit d'un cas spécifique de comment obtenir la taille d'un tableau, qui a déjà une réponse générale ici : stackoverflow.com/questions/37538/ C'est-à-dire un double.