- Comment d=E9clarer et allouer un tableau T de chaines de caract=E8res de
N cases ?
- Dans le tableau T, est ce que il y a une taille limit=E9e =E0 ne pas
d=E9passer dans la case? si oui combien cette taille ?
- Comment d=E9clarer et allouer un tableau T de deux dimension de
chaines de caract=E8res de N cases ?
- Comment d=E9clarer et allouer un tableau T d'entiers de N cases ?
- Combien la valeur maximale d'un entier ?
- Combien la valeur maximale d'une chaine de caract=E8re ?
- si on a T un tableau de chaines de caract=E8res(10 cases) et ch est
une chaine de caract=E8re(de taille 10):
char ch[10];
char T[10];
Si cette d=E9claration est juste alors quelle est la diff=E9rence entre T
et ch ?
- Si on veut utiliser un pointeur sur un tableau de chaines de
caract=E8res de taille alors comment on alloue ce tableau ?
- Dans quel cas, on utilise un simple tableau T de chaines de
caract=E8res ou un pointeur sur ce tableau ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Bertrand Lenoir-Welter
> - Comment déclarer et allouer un tableau T de chaines de caractères de N cases ?
Ca devient un peu loufoque, mais bon...
N cases, c'est la taille maxi de chaque chaîne ou le nombre de chaînes dans le tableau ?
- Dans le tableau T, est ce que il y a une taille limitée à ne pas dépasser dans la case? si oui combien cette taille ?
Vous faites ce que vous voulez tant que vous ne débordez pas de l'ensemble. L'espace mémoire alloué est à vous.
- Comment déclarer et allouer un tableau T de deux dimension de chaines de caractères de N cases ?
Soyez plus explicite. Vous connaissez d'avance les dimensions maxi, ou il faut allouer de façon dynamique ?
- Comment déclarer et allouer un tableau T d'entiers de N cases ?
#define N ... int T[N];
- Combien la valeur maximale d'un entier ?
MAX_INT
- Combien la valeur maximale d'une chaine de caractère ?
Euh, c'est quoi, la valeur d'une chaîne de caractères ?
- si on a T un tableau de chaines de caractères(10 cases) et ch est une chaine de caractère(de taille 10): char ch[10]; char T[10]; Si cette déclaration est juste alors quelle est la différence entre T et ch ?
Cette déclaration est juste, et la seule différence entre T et ch est qu'ils ne sont pas à la même adresse, outre leur contenu.
- Si on veut utiliser un pointeur sur un tableau de chaines de caractères de taille alors comment on alloue ce tableau ?
Avec malloc(). Et si vous devez lui changer sa taille, realloc(). Ne pas oublier le free() en sortant.
- Dans quel cas, on utilise un simple tableau T de chaines de caractères ou un pointeur sur ce tableau ?
On utilise une allocation dynamique quand on ne sait pas à l'avance quelle taille la donnée va prendre dans la mémoire. Si l'on est sûr que N ne peut pas dépasser une valeur définie, on peut faire une simple déclaration avec N dimensions.
> - Comment déclarer et allouer un tableau T de chaines de caractères de
N cases ?
Ca devient un peu loufoque, mais bon...
N cases, c'est la taille maxi de chaque chaîne ou le nombre de chaînes
dans le tableau ?
- Dans le tableau T, est ce que il y a une taille limitée à ne pas
dépasser dans la case? si oui combien cette taille ?
Vous faites ce que vous voulez tant que vous ne débordez pas de
l'ensemble. L'espace mémoire alloué est à vous.
- Comment déclarer et allouer un tableau T de deux dimension de
chaines de caractères de N cases ?
Soyez plus explicite. Vous connaissez d'avance les dimensions maxi, ou
il faut allouer de façon dynamique ?
- Comment déclarer et allouer un tableau T d'entiers de N cases ?
#define N ...
int T[N];
- Combien la valeur maximale d'un entier ?
MAX_INT
- Combien la valeur maximale d'une chaine de caractère ?
Euh, c'est quoi, la valeur d'une chaîne de caractères ?
- si on a T un tableau de chaines de caractères(10 cases) et ch est
une chaine de caractère(de taille 10):
char ch[10];
char T[10];
Si cette déclaration est juste alors quelle est la différence entre T
et ch ?
Cette déclaration est juste, et la seule différence entre T et ch est
qu'ils ne sont pas à la même adresse, outre leur contenu.
- Si on veut utiliser un pointeur sur un tableau de chaines de
caractères de taille alors comment on alloue ce tableau ?
Avec malloc(). Et si vous devez lui changer sa taille, realloc(). Ne pas
oublier le free() en sortant.
- Dans quel cas, on utilise un simple tableau T de chaines de
caractères ou un pointeur sur ce tableau ?
On utilise une allocation dynamique quand on ne sait pas à l'avance
quelle taille la donnée va prendre dans la mémoire. Si l'on est sûr que
N ne peut pas dépasser une valeur définie, on peut faire une simple
déclaration avec N dimensions.
> - Comment déclarer et allouer un tableau T de chaines de caractères de N cases ?
Ca devient un peu loufoque, mais bon...
N cases, c'est la taille maxi de chaque chaîne ou le nombre de chaînes dans le tableau ?
- Dans le tableau T, est ce que il y a une taille limitée à ne pas dépasser dans la case? si oui combien cette taille ?
Vous faites ce que vous voulez tant que vous ne débordez pas de l'ensemble. L'espace mémoire alloué est à vous.
- Comment déclarer et allouer un tableau T de deux dimension de chaines de caractères de N cases ?
Soyez plus explicite. Vous connaissez d'avance les dimensions maxi, ou il faut allouer de façon dynamique ?
- Comment déclarer et allouer un tableau T d'entiers de N cases ?
#define N ... int T[N];
- Combien la valeur maximale d'un entier ?
MAX_INT
- Combien la valeur maximale d'une chaine de caractère ?
Euh, c'est quoi, la valeur d'une chaîne de caractères ?
- si on a T un tableau de chaines de caractères(10 cases) et ch est une chaine de caractère(de taille 10): char ch[10]; char T[10]; Si cette déclaration est juste alors quelle est la différence entre T et ch ?
Cette déclaration est juste, et la seule différence entre T et ch est qu'ils ne sont pas à la même adresse, outre leur contenu.
- Si on veut utiliser un pointeur sur un tableau de chaines de caractères de taille alors comment on alloue ce tableau ?
Avec malloc(). Et si vous devez lui changer sa taille, realloc(). Ne pas oublier le free() en sortant.
- Dans quel cas, on utilise un simple tableau T de chaines de caractères ou un pointeur sur ce tableau ?
On utilise une allocation dynamique quand on ne sait pas à l'avance quelle taille la donnée va prendre dans la mémoire. Si l'on est sûr que N ne peut pas dépasser une valeur définie, on peut faire une simple déclaration avec N dimensions.
programmation
Bonjour,
Voici mon propre code. Je voulais modifiez la solution ou lieu de faire *** rets(tableau de tableau) alors on fait **rets(un simple) tableau de chaine de caractères car je vais faire une seule comparaison entre deux tableaux. Que proposez vous comme solution et modification à faire dans l'appel de fonction de comparaison et l'allocation de 'rets' et dans la fonction de comparaison de telle sorte que 'rets' soit un simple tableau de chaines de caractères ?
int i,a, retsize = 0,index,p; char **ret = NULL,result[1024]; int size1;
for(i=0;i<nb_comb;i++) {
a = 0;
for (p=0; p <nb_con; p++) {
if (is_same(tab_comb[i], tab_con[0][p], 0)) {
a = 1; break; }
}
if (!a) { ret = xrealloc(ret, (++retsize) * sizeof(char*)); /* On alloue une case de plus au tableau de string, puis on ajoute la chaine à la fin du tableau */ ret[retsize-1] = mstrndup(tab_comb[i], strlen(tab_comb [i]));
} }
ret = xrealloc(ret, (++retsize) * sizeof(char*)); /* On ajoute un dernier pointeur sur NULL pour savoir quand le tableau se termine */ ret[retsize-1] = NULL;
return ret; }
Voici les autres fonctions utilisant par le code au dessus:
/** Teste le retour de realloc et quitte le programme si besoin */ void * xrealloc(void * prec, size_t len) { void *ret = realloc(prec, len); if(!ret) /* Equivaut à if(ret == NULL) */ exit(0); return ret; }
/** Copie n caractère de str dans une nouvelle chaine alloué dynamiquement, et renvoie cette chaine */ char * mstrndup(const char *str, size_t n) { char *ret = malloc((n+1) * sizeof(char));
if (!ret) exit(0);
strncpy(ret, str, n); /* Copie n caractère de str dans n */ ret[n] = 0; /* 0 == ' ' */ return ret; }
/** Compte le nombre de mot dans str (un mot correspond à une suite de lettre et s'arrête dès qu'un caractère autre est rencontré */ size_t count_word(const char *str) { size_t n = 0; int a;
while (*str) /* Equivaut à while(*str != ' ') */ { a = 0; /* Cette variable sert à indiquer si au moins une lettre a été trouvé (pour éviter les lignes vides) */
while (!isspace((unsigned char) *str) && *str) str++, a = 1; if (a) n++; while (isspace((unsigned char) *str) && *str) str++; } return n; }
/** copie les mots de la chaine str dans le tableau de chaine de caractère tab */ void get_word(char **tab, const char *str) { const char* p = str; int a, i = 0; /* Le fonctionnement est le même que pour la fonction count_word mais ici on enregistre la chaien dans un tableau. On pourrait le faire en une seule fonction mais il faudrai à chaque fois réallouer de la mémoire et ce n'est pas très propre */ while (*str) { a = 0; while (!isspace((unsigned char) *p) && *p) p++, a = 1; if (a) tab[i++] = mstrndup(str, p-str); /* Si on a trouvé un mot, on met dans tab[i] le mot (la suite de lettre trouvé) et on incrémente i. p-str correspond à la taille du mot, c'est l'adresse du caractère suivant le dernier caractère moins l'adresse du premier caractère */
/** Compare deux tableaux de mots, renvoie 1 si ces tableaux sont identiques sans tenir compte de l'ordre ni du nombre de mot, 0 sinon (En fait, il renvoie 1 si chaque ligne de t1 existe dans t2) */ int compareline(char **t1, size_t size1, char **t2, size_t size2) { int ret = 1; size_t i, j; int a;
/* Pour chaque ligne de t1, on compare avec chaque ligne de t2. Si à un moment on ne trouve pas la ligne, alors les tableaux ne sont pas identiques */ for (i = 0; i < size1; i++) { a = 0; for (j = 0; j < size2; j++) if (!strcmp(t1[i], t2[j])) { a = 1; break; /* Dès que la ligne est trouvé, on peux arrête r de comparer pour cette valeur du tableau */ }
if (!a) { ret = 0; break; /* Dès qu'une ligne manque, on peux arrêter la comparaison */ } } return ret; }
/** Compare deux chaines de caractère, si comparesize vaut 1 alors la première doit contenir la seconde, et renvoie 1 si elles sont identiques sans tenir compte de l'ordre des mots */ int is_same(const char *s1, const char *s2, int comparesize) { char **t1, **t2; size_t size1 = count_word(s1), size2 = count_word(s2);
int ret = 0;
if (!comparesize || (size1 > size2)) /* Si comparesize vaut 0, on ne compare pas la taille, si comparesize vaut 1 alors il faut que size1 > size 2 */ { t1 = malloc(size1 * sizeof(char*)); t2 = malloc(size2 * sizeof(char*));
if (t1 && t2) { get_word(t1, s1); get_word(t2, s2);
Voici mon propre code. Je voulais modifiez la solution ou lieu de
faire *** rets(tableau de tableau) alors on fait **rets(un simple)
tableau de chaine de caractères car je vais faire une seule
comparaison entre deux tableaux.
Que proposez vous comme solution et modification à faire dans l'appel
de fonction de comparaison et l'allocation de 'rets' et dans la
fonction de comparaison de telle sorte que 'rets' soit un simple
tableau de chaines de caractères ?
int i,a, retsize = 0,index,p;
char **ret = NULL,result[1024];
int size1;
for(i=0;i<nb_comb;i++)
{
a = 0;
for (p=0; p <nb_con; p++)
{
if (is_same(tab_comb[i], tab_con[0][p], 0))
{
a = 1;
break;
}
}
if (!a)
{
ret = xrealloc(ret, (++retsize) * sizeof(char*)); /*
On alloue une case de plus au tableau de string, puis on ajoute la
chaine à la fin du tableau */
ret[retsize-1] = mstrndup(tab_comb[i], strlen(tab_comb
[i]));
}
}
ret = xrealloc(ret, (++retsize) * sizeof(char*)); /* On ajoute
un dernier pointeur sur NULL pour savoir quand le tableau se termine
*/
ret[retsize-1] = NULL;
return ret;
}
Voici les autres fonctions utilisant par le code au dessus:
/** Teste le retour de realloc et quitte le programme si besoin */
void * xrealloc(void * prec, size_t len)
{
void *ret = realloc(prec, len);
if(!ret) /* Equivaut à if(ret == NULL) */
exit(0);
return ret;
}
/** Copie n caractère de str dans une nouvelle chaine alloué
dynamiquement, et renvoie cette chaine */
char * mstrndup(const char *str, size_t n)
{
char *ret = malloc((n+1) * sizeof(char));
if (!ret)
exit(0);
strncpy(ret, str, n); /* Copie n caractère de str dans n */
ret[n] = 0; /* 0 == ' ' */
return ret;
}
/** Compte le nombre de mot dans str (un mot correspond à une suite de
lettre et s'arrête dès qu'un caractère autre est rencontré */
size_t count_word(const char *str)
{
size_t n = 0;
int a;
while (*str) /* Equivaut à while(*str != ' ') */
{
a = 0; /* Cette variable sert à indiquer si au moins une
lettre a été trouvé (pour éviter les lignes vides) */
while (!isspace((unsigned char) *str) && *str) str++, a = 1;
if (a) n++;
while (isspace((unsigned char) *str) && *str) str++;
}
return n;
}
/** copie les mots de la chaine str dans le tableau de chaine de
caractère tab */
void get_word(char **tab, const char *str)
{
const char* p = str;
int a, i = 0;
/* Le fonctionnement est le même que pour la fonction count_word
mais ici on enregistre la chaien dans un tableau. On pourrait le faire
en une seule
fonction mais il faudrai à chaque fois réallouer de la mémoire et
ce n'est pas très propre */
while (*str)
{
a = 0;
while (!isspace((unsigned char) *p) && *p) p++, a = 1;
if (a)
tab[i++] = mstrndup(str, p-str); /* Si on a trouvé un mot,
on met dans tab[i] le mot (la suite de lettre trouvé) et on incrémente
i.
p-str correspond à la taille du mot, c'est l'adresse du
caractère suivant le dernier caractère moins l'adresse du premier
caractère */
/** Compare deux tableaux de mots, renvoie 1 si ces tableaux sont
identiques sans tenir compte de l'ordre ni du nombre de mot, 0 sinon
(En fait, il renvoie 1
si chaque ligne de t1 existe dans t2) */
int compareline(char **t1, size_t size1, char **t2, size_t size2)
{
int ret = 1;
size_t i, j;
int a;
/* Pour chaque ligne de t1, on compare avec chaque ligne de t2. Si
à un moment on ne trouve pas la ligne, alors les tableaux ne sont pas
identiques */
for (i = 0; i < size1; i++)
{
a = 0;
for (j = 0; j < size2; j++)
if (!strcmp(t1[i], t2[j]))
{
a = 1;
break; /* Dès que la ligne est trouvé, on peux arrête r
de comparer pour cette valeur du tableau */
}
if (!a)
{
ret = 0;
break; /* Dès qu'une ligne manque, on peux arrêter la
comparaison */
}
}
return ret;
}
/** Compare deux chaines de caractère, si comparesize vaut 1 alors la
première doit contenir la seconde, et renvoie 1 si elles sont
identiques sans tenir
compte de l'ordre des mots */
int is_same(const char *s1, const char *s2, int comparesize)
{
char **t1, **t2;
size_t size1 = count_word(s1), size2 = count_word(s2);
int ret = 0;
if (!comparesize || (size1 > size2)) /* Si comparesize vaut 0, on
ne compare pas la taille, si comparesize vaut 1 alors il faut que
size1 > size 2 */
{
t1 = malloc(size1 * sizeof(char*));
t2 = malloc(size2 * sizeof(char*));
if (t1 && t2)
{
get_word(t1, s1);
get_word(t2, s2);
Voici mon propre code. Je voulais modifiez la solution ou lieu de faire *** rets(tableau de tableau) alors on fait **rets(un simple) tableau de chaine de caractères car je vais faire une seule comparaison entre deux tableaux. Que proposez vous comme solution et modification à faire dans l'appel de fonction de comparaison et l'allocation de 'rets' et dans la fonction de comparaison de telle sorte que 'rets' soit un simple tableau de chaines de caractères ?
int i,a, retsize = 0,index,p; char **ret = NULL,result[1024]; int size1;
for(i=0;i<nb_comb;i++) {
a = 0;
for (p=0; p <nb_con; p++) {
if (is_same(tab_comb[i], tab_con[0][p], 0)) {
a = 1; break; }
}
if (!a) { ret = xrealloc(ret, (++retsize) * sizeof(char*)); /* On alloue une case de plus au tableau de string, puis on ajoute la chaine à la fin du tableau */ ret[retsize-1] = mstrndup(tab_comb[i], strlen(tab_comb [i]));
} }
ret = xrealloc(ret, (++retsize) * sizeof(char*)); /* On ajoute un dernier pointeur sur NULL pour savoir quand le tableau se termine */ ret[retsize-1] = NULL;
return ret; }
Voici les autres fonctions utilisant par le code au dessus:
/** Teste le retour de realloc et quitte le programme si besoin */ void * xrealloc(void * prec, size_t len) { void *ret = realloc(prec, len); if(!ret) /* Equivaut à if(ret == NULL) */ exit(0); return ret; }
/** Copie n caractère de str dans une nouvelle chaine alloué dynamiquement, et renvoie cette chaine */ char * mstrndup(const char *str, size_t n) { char *ret = malloc((n+1) * sizeof(char));
if (!ret) exit(0);
strncpy(ret, str, n); /* Copie n caractère de str dans n */ ret[n] = 0; /* 0 == ' ' */ return ret; }
/** Compte le nombre de mot dans str (un mot correspond à une suite de lettre et s'arrête dès qu'un caractère autre est rencontré */ size_t count_word(const char *str) { size_t n = 0; int a;
while (*str) /* Equivaut à while(*str != ' ') */ { a = 0; /* Cette variable sert à indiquer si au moins une lettre a été trouvé (pour éviter les lignes vides) */
while (!isspace((unsigned char) *str) && *str) str++, a = 1; if (a) n++; while (isspace((unsigned char) *str) && *str) str++; } return n; }
/** copie les mots de la chaine str dans le tableau de chaine de caractère tab */ void get_word(char **tab, const char *str) { const char* p = str; int a, i = 0; /* Le fonctionnement est le même que pour la fonction count_word mais ici on enregistre la chaien dans un tableau. On pourrait le faire en une seule fonction mais il faudrai à chaque fois réallouer de la mémoire et ce n'est pas très propre */ while (*str) { a = 0; while (!isspace((unsigned char) *p) && *p) p++, a = 1; if (a) tab[i++] = mstrndup(str, p-str); /* Si on a trouvé un mot, on met dans tab[i] le mot (la suite de lettre trouvé) et on incrémente i. p-str correspond à la taille du mot, c'est l'adresse du caractère suivant le dernier caractère moins l'adresse du premier caractère */
/** Compare deux tableaux de mots, renvoie 1 si ces tableaux sont identiques sans tenir compte de l'ordre ni du nombre de mot, 0 sinon (En fait, il renvoie 1 si chaque ligne de t1 existe dans t2) */ int compareline(char **t1, size_t size1, char **t2, size_t size2) { int ret = 1; size_t i, j; int a;
/* Pour chaque ligne de t1, on compare avec chaque ligne de t2. Si à un moment on ne trouve pas la ligne, alors les tableaux ne sont pas identiques */ for (i = 0; i < size1; i++) { a = 0; for (j = 0; j < size2; j++) if (!strcmp(t1[i], t2[j])) { a = 1; break; /* Dès que la ligne est trouvé, on peux arrête r de comparer pour cette valeur du tableau */ }
if (!a) { ret = 0; break; /* Dès qu'une ligne manque, on peux arrêter la comparaison */ } } return ret; }
/** Compare deux chaines de caractère, si comparesize vaut 1 alors la première doit contenir la seconde, et renvoie 1 si elles sont identiques sans tenir compte de l'ordre des mots */ int is_same(const char *s1, const char *s2, int comparesize) { char **t1, **t2; size_t size1 = count_word(s1), size2 = count_word(s2);
int ret = 0;
if (!comparesize || (size1 > size2)) /* Si comparesize vaut 0, on ne compare pas la taille, si comparesize vaut 1 alors il faut que size1 > size 2 */ { t1 = malloc(size1 * sizeof(char*)); t2 = malloc(size2 * sizeof(char*));
if (t1 && t2) { get_word(t1, s1); get_word(t2, s2);