Problème de boucle avec deux char*.
Fermé
Dreinale
Messages postés
4
Date d'inscription
jeudi 1 novembre 2018
Statut
Membre
Dernière intervention
2 novembre 2018
-
Modifié le 2 nov. 2018 à 00:56
Dreinale Messages postés 4 Date d'inscription jeudi 1 novembre 2018 Statut Membre Dernière intervention 2 novembre 2018 - 2 nov. 2018 à 13:50
Dreinale Messages postés 4 Date d'inscription jeudi 1 novembre 2018 Statut Membre Dernière intervention 2 novembre 2018 - 2 nov. 2018 à 13:50
A voir également:
- Problème de boucle avec deux char*.
- Deux ecran pc - Guide
- Itinéraire google map entre deux adresses - Guide
- Deux comptes whatsapp - Guide
- Faire deux colonnes sur word - Guide
- Concatener deux cellules excel - Guide
2 réponses
NHenry
Messages postés
15173
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
21 décembre 2024
350
Modifié le 1 nov. 2018 à 18:10
Modifié le 1 nov. 2018 à 18:10
malloc alloue la mémoire, mais ne la remet pas à 0, fais un memset avant.
Et size_read reste à 0.
Prends l'abitude de passer en debug et d'espionner les valeurs des variables.
Et size_read reste à 0.
Prends l'abitude de passer en debug et d'espionner les valeurs des variables.
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
2 nov. 2018 à 00:54
2 nov. 2018 à 00:54
Bonjour,
Si l'idée est de dupliquer une chaîne dans une autre, tu devrais peut être regarder strdup.
Et si tu veux vraiment écrire la boucle et l'arrêter quand tu découvres le caractère terminal
Car ici ton test arrête la recopie dès que "par chance" ce qu'il y a en mémoire coïncide au niveau de
Ensuite :
- appliquer sur une chaîne qui n'est pas encore terminée par
-
- merci d'utiliser les balises de code (4e bouton au dessus de la boîte dans laquelle tu tapes ton message)
- si tu veux vraiment initialiser un bloc mémoire à zéro, tu peux utiliser
- qui dit
Bonne chance
Si l'idée est de dupliquer une chaîne dans une autre, tu devrais peut être regarder strdup.
Et si tu veux vraiment écrire la boucle et l'arrêter quand tu découvres le caractère terminal
'\0', il faudrait plutôt écrire :
while (*bm++ = *b++);
Car ici ton test arrête la recopie dès que "par chance" ce qu'il y a en mémoire coïncide au niveau de
bm[i]et
b[i]. Or sur un
malloc, où la mémoire n'est pas mise à zéro, ça engendre un comportement qui peut différer en fonction de ce qu'il y a en mémoire à cet endroit.
Ensuite :
- appliquer sur une chaîne qui n'est pas encore terminée par
'\0'peut engendrer une erreur de segmentation
-
returnest un mot clé du C, pas une fonction, donc pas besoin de parenthèse
- merci d'utiliser les balises de code (4e bouton au dessus de la boîte dans laquelle tu tapes ton message)
- si tu veux vraiment initialiser un bloc mémoire à zéro, tu peux utiliser
mallocet
memsetou plus rapidement
calloc.
- qui dit
malloc(resp.
strdup, resp.
calloc) dit qu'il faudra penser à faire le
freecorrespondant.
Bonne chance
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié le 2 nov. 2018 à 13:56
Modifié le 2 nov. 2018 à 13:56
oui la fonction tiendrait en une seule ligne avec strdup sans malloc ou calloc nécessaires, ni boucle.
https://en.cppreference.com/w/c/experimental/dynamic/strdup
en fait, je ne suis même pas sûr que faire une fonction soit réellement utile, car il suffit de faire
j'ajouterais :
- que le
- que la mise à zéro de la mémoire allouée n'est pas nécessaire si la condition de test de sortie de la boucle est correctement indiquée comme proposé par NHenry ou que la boucle while est remplacée par la solution tout en un ci-dessus de mamiemando ne nécessitant pas de corps de boucle et opérant à la fois les tests et l'incrémentiion.
- que le
Dal
https://en.cppreference.com/w/c/experimental/dynamic/strdup
en fait, je ne suis même pas sûr que faire une fonction soit réellement utile, car il suffit de faire
bm = strdup("9785634120");dans la fonction appelante au lieu d'appeler
int test_c(char *bm)...
j'ajouterais :
- que le
bm = malloc(sizeof(char) * (size_read + 1));n'alloue qu'un seul byte (0 + 1) et que c'est ce qui provoque les segfaults en premier (Whismeril a très justement signalé que size_read reste à 0), outre les autres erreurs, puisque le code écrit dès le 2ème caractère dans une zone mémoire non allouée au programme
- que la mise à zéro de la mémoire allouée n'est pas nécessaire si la condition de test de sortie de la boucle est correctement indiquée comme proposé par NHenry ou que la boucle while est remplacée par la solution tout en un ci-dessus de mamiemando ne nécessitant pas de corps de boucle et opérant à la fois les tests et l'incrémentiion.
- que le
return (bm);, avec ou sans parenthèses, est erroné car le prototype de la fonction exige un
inten retour, et non pas un pointeur sur char et qu'il est, de toutes façons, inutile, puisque le contenu du pointeur bm modifié est accessible à la fonction appelante, en raison du passage de paramètre de la fonction.
Dal
Dreinale
Messages postés
4
Date d'inscription
jeudi 1 novembre 2018
Statut
Membre
Dernière intervention
2 novembre 2018
2 nov. 2018 à 13:50
2 nov. 2018 à 13:50
D'accord merci beacoup!
1 nov. 2018 à 19:11
1 nov. 2018 à 20:17
while (bm[i] != b[i])
fais
while (b[i]!=0)
mais renseignes-toi sur memset, cette fonction te sera très utile.
1 nov. 2018 à 21:43