Petit probleme chaines en C

Fermé
Romano492 - 28 mai 2009 à 17:48
 loupius - 29 mai 2009 à 03:03
Bonjour,
j'ai un soucis avec ce code (je débute)
je voudrais convertir le tableau tab[][]
en chaine de caractere msgenv afin de pouvoir faire un printf dessus...
et bien sur sa ne marche pas comme je le souhaite donc si vous avez une solution ?
même si c'est différent de ce code je suis preneur !
merci d'avance...

int main(void)
{
int n = 2;
char *msg;
char *msgenv;
char tab[64][128]={"premier","deuxieme","troisieme","quatrieme"};

while(n < 64)
{
msg = tab[n];
strcat(msgenv,msg);
strcat(msgenv," ");
n++;
}
printf("%s",msgenv);
return 0;
}

3 réponses

bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 860
28 mai 2009 à 18:55
En effet, msgenv n'est qu'un pointeur, tu as omis de lui allouer de la mémoire. Du coup, quand tu concatènes après, tu concatènes avec de la mémoire non allouée... ça plante :)

char *msgenv = malloc((64*128+1)*sizeof(char)); //64*128+1 parce que vu ce que tu concatènes par la suite, c'est au maximum 64*128 caractères.

Au passage si tu ne te sert pas de ton n autrement dans la while(), autant utiliser une for() c'est plus joli.
for(n = 2 ; n < 64 ; n++)
{
  msg = tab[n];
  strcat(msgenv,msg);
  strcat(msgenv," ");
} 
0
Décidément on retombe toujours sur les mêmes problèmes et on comprend pourquoi certains décrient tant le langage C. Le C est un langage qui requiert un minimum de rigueur ! Il ne faut pas l'oublier... et ne pas s'en plaindre car c'est ce qui donne aussi tant de force à ce langage.
Alors utiliser un pointeur implique de respecter l'ordre suivant:
- déclaration / initialisation,
- allocation,
- utilisation,
- libération.
A de rares exceptions près, le non-respect de cet ordre mène tout droit à de graves difficultés.
Qu'avons-nous ici?
int n = 2;
char *msg;
char *msgenv;
char tab[64][128]={"premier","deuxieme","troisieme","quatrieme"};
while(n < 64)
{
msg = tab[n];
strcat(msgenv,msg);
strcat(msgenv," ");
...
}
Que d'erreurs !!!
Un boucle sur 'n' qui va de 2 à 63, mais il n'y a rien à partir de 4 --->>> on pointe n'importe où. Il faut déclarer:
char tab[64][128]={"premier","deuxieme","troisieme","quatrieme", 0};
et faire un test du style while (tab[++n]) (initialiser n à 1)

strcat(msgenv,msg);
La chaîne pointée par 'msg' va être recopiée à la suite dans 'msgenv', mais comme aucune mémoire n'a été allouée, c'est le 'segment fault' assuré.
Bonne réflexion.
0
Alors d'abord merci pour vos reponses j'en apprends plus sur le malloc...
pour le n initialisé a 2 en fait c'est parceque j'utilise le petit bout de code la dans un autre ou il me faut les entrées qui sont apres 2 dans le tableau
Et finalement j'ai reussi a faire plus simple en mettant la chaine grace a sprintf()
puis strcat() avec une boucle while
cest pas propre je pense mais sa marche ...
Pour le for() en fait je voulais juste une boucle donc j'ai pas reflechi...

En tout cas merci car je ne voyais pas a quoi servait malloc concretement...
j'ai du mal avec la notion de pointeur comme vous avez pu voir...
0
Il existe des langages plus simples et plus modernes qui ne font pas appel à ces notions... Python par exemple.
0