Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

tableau double souffrance

12 réponses
Avatar
Jean Pierre Daviau
Bonjour aux médecins (je suis souffrant),


printf("\n*cinq: %s\n", *cinq[i*NCOLS + j]); affiche *cinq: Il
Útait

ce qui est correct et puis ... crash.


/* tstdbleA.c */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

#define NRANGS 2
#define NCOLS 3

unsigned char *cinq[NRANGS][NCOLS];
int joinLines2array(unsigned char *ligne1, unsigned char *ligne2, unsigned
int lenin);



int joinLines2array(unsigned char *ligne1, unsigned char *ligne2, unsigned
int lenin) {
static int i;
int j, k=0;
unsigned char *s;


for (i = 0;i < NRANGS; i++) {
*cinq[i*NCOLS] = malloc(lenin);
while (*ligne1 != '\n') {
for (j = 0;j <NCOLS; j++) {
s = malloc(strlen(ligne1));
if(s){
while (*ligne1 != '^')
{
s[k] = *ligne1;
printf("%c ", s[k]);
ligne1++;
k++;
}
k++;
s[k] = '\0';
if(strlen(*cinq[i*NCOLS + j]) >0)
strcpy(*cinq[i*NCOLS + j], s);
else
strcat(*cinq[i*NCOLS + j], s);
printf("\n*cinq: %s\n", *cinq[i*NCOLS + j]);
}
}
s = s-k;
k = 0;
printf("1");
/* test négatif si s = null */
/* free(s);

if(s)
ligne1++;
else{
printf("s not freed.\n");
return EXIT_FAILURE;
} */

}
strcat(*cinq[i*NCOLS + j], ligne2);
printf("%s\n", *cinq[i*NCOLS + j]);
}
if(s)
free(s);

return 0;
}

int main(void){
unsigned char *une = "Il était^ une^ fois";
unsigned char *deux = "Il^ était deux^ fois.";

unsigned int len = strlen(une) + strlen(deux) + 1;
if(len)
joinLines2array(une, deux, len);

return 0;
}

Merci dans le sens je demande merci.

Jean Pierre Daviau
--
Easyphp1.8 with Apache1.3.24
Lcc, borland 5.5
windows Xp
asus p4 s533/333/133
Intel(R) Celeron (R) CPU 2.00 GHz
Processor Radeon7000 0x5159 agp

2 réponses

1 2
Avatar
Jean Pierre Daviau
Si si, je t'assure :-)
J'ai essayé, je suis assuré. ;-)

Ton strchr(ligne1, '^') te donnant la position du premier caractère '^',
le s_len est donc *exactement* égal à la longueur du mot précédant le
'^'. Il faut donc rajouter 1 pour avoir de la place pour le ''. Tu
peux essayer sur un example, pour voir.


Merci. Tu finiras dans l'enseignement. ;-)
J'ai esayé ça:
*(j+ cinq[i] )
*(cinq[i] + j)
Ça marche.


cinq[i][j][s_len] = '';



C'est quoi ça [s_len] en troisième position.
cinq[i][j] est un char *, cinq[i][j][s_len] est le caractère d'indice

s_len de cette chaîne. Il serait peut-être un peu plus propre d'écrire
*(char[i][j] + s_len) mais je trouve que c'est moins clair,
personnellement.
Ça marche.



Dans ce cas pourquoi en se débarrassant du *s, quelque chose du genre?
s_len = trouve - ligne1;
cinq[i][j]= malloc (s_len + 1);
cinq[i][j][s_len] = '0';

Ça ne marche pas. Ou alors, c'est moi. Bon, c'est moi.

JPD



Avatar
Jean Pierre Daviau
Il fonctionne.... pas de *s
peux essayer sur un example, pour voir.



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

#define NRANGS 2
#define NCOLS 5

char *cinq[NRANGS][NCOLS];
void joinLines2array(char *ligne1, char *ligne2);

void joinLines2array(char *ligne1, char *ligne2) {
static int i = -1;
int j = 0;
char *trouve;
size_t s_len;

i++;

while (*ligne1 != 'n') {
trouve = strchr(ligne1, '^');
if (trouve == NULL) {
printf("Ligne %d Trouve pas le ^", __LINE__);
} else {
s_len = trouve - ligne1; /* soustraction d'adresse */
*(cinq[i] + j) = malloc (s_len + 1);
}
if (*(cinq[i] + j) == NULL)
printf("s == NULL", __LINE__);
else {
strncpy(*(cinq[i] + j), ligne1, s_len);
cinq[i][j][s_len] = '';
}

printf("%s", *(cinq[i] + j));

if (j < (NCOLS - 1))j++;
else { break; }

ligne1 += s_len + 1;

}

free(trouve);
trouve = strchr(ligne2, 'n');
s_len = trouve - ligne2;
*(cinq[i] + j) = malloc(s_len+1);

if (strcpy(*(cinq[i] + j), ligne2) != NULL) {
cinq[i][j][s_len] = '';
}

/* do {
*(s + k) = *(ligne2 + k) == 'n' ? '' : *(ligne2 + k);
} while (*(s + k++) != ''); */

free(trouve);
printf("%sn", *(cinq[i] + j));

}

int main(void) {
int i, j;
char *une = "C'était^ une^ paisible^ révolution.^n";
char *deux = "Tu as bien fait.n";
char *trois = "Acquiert^ une^ difficile^ attention.^n";
char *quatre = "Plusieur bonnes tentatives.n";



joinLines2array(une, deux);
for (i=0, j = 0; j <NCOLS; j++)
printf("%s", *(cinq[i] + j));

printf("nn");

joinLines2array(trois, quatre);

for (i = 1; i < NRANGS; i++ )
for (j = 0; j <NCOLS; j++)
printf("%s", *(cinq[i] + j));

printf("n-----------------n");

return 0;
}

1 2