CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Problème

-erezan-
-erezan-
Niveau 10
23 septembre 2016 à 18:43:00

Bonjour,

ça fait un p'tit bout de temps que je cherche la solution à mon problème, sans succès. Du coup j'en viens à vous, si quelqu'un pourrait m'aider SVP.

Donc voici l'exercice :
Écrivez une fonction developper(s1, s2) qui lorsqu'elle rencontre des abréviations comme a-z dans la chaîne s1, les écrit sous leur forme développée abc...xyz dans s2. La fonction devra traiter des lettres majuscules ou minuscules et des chiffres. Prévoyez des cas comme a-b-c, a-z0-9 et -a-z et faites en sorte que les - qui figurent au début ou à la fin soient copiés tels quels.

Mon code :
#include <stdio.h> #define MAXCHAR 100 void developper (char s1[], char s2[]); int main () { char s1[MAXCHAR] = "a-b-c a-z0-9 -a-z"; char s2[MAXCHAR]; developper (s1, s2); printf ("%s\n%s\n", s1, s2); return 0; } void developper (char s1[], char s2[]) { int i, j; for (i=j=0; s1[i]!=EOF; i++) { if (s1[i] == '-' && (s1[i-1] != ' ' && s1[i+1] != ' ') ) { do { s2[j++] = (s2[j-1]+1); } while (s2[j] > s1[i+1]); } else s2[j++] = s1[i]; } }

Le résultat en sortie :
[khelil@archvm:C]$ ./developper
a-b-c a-z0-9 -a-z
a
[khelil@archvm:C]$ ./developper
Erreur de segmentation (core dumped)
[khelil@archvm:C]$
(en gros, le resultat est assez random ... why ?)

Quelqu'un saurait me dire d'où vient l'erreur ?

Message édité le 23 septembre 2016 à 18:46:40 par -erezan-
-erezan-
-erezan-
Niveau 10
23 septembre 2016 à 18:49:15

Le code sur Pastebin pour une meilleur lisibilité : http://pastebin.com/0j7AtJaY

edit : on peut voir que dans la condition du while c'est tant que s2[j] est supérieur à s1[i+1] au lieu de l'inverse, j'ai fait exprès car j'ai l'impression que ça fonctionnait mieux comme ça (pourquoi, je sais pas) mais en tout cas, ça ne change rien si on inverse l'opérateur ...

Je me demande même si c'est pas un problème lié à ma VM, parce-que j'ai relu le code au moins vingt fois et j'vois pas d'erreur apparente ...

Message édité le 23 septembre 2016 à 18:53:26 par -erezan-
Pseudo supprimé
Pseudo supprimé 23 septembre 2016 à 18:59:18

Je comprends pas en fait, que dois donner : a-b-c a-z0-9 -a-z
une fois l'appel de la fonction ?

Au passage je comprends pas s1[i] != EOF.
Tu veux vérifier si à la fin de la chaine? ton tableau fait 100 caractères, ta chaine 17 si t'es en dehors t'obtient 0 pas -1. Donc à revoir de ce côté

Message édité le 23 septembre 2016 à 19:04:12 par Pseudo supprimé
-erezan-
-erezan-
Niveau 10
23 septembre 2016 à 19:03:24

Le 23 septembre 2016 à 18:59:18 demonyunther a écrit :
Je comprends pas en fait, que dois donner : a-b-c a-z0-9 -a-z
une fois l'appel de la fonction ?

C'est écrit dans l'énoncé.
a-b-c doit donner a-b-c mais a-z doit donner abc...xyz, de même pour 0-9.

Pseudo supprimé
Pseudo supprimé 23 septembre 2016 à 19:05:19

Justement j'ai lu l'énoncé et j'ai pas compris c'est pour ca que je voulais avoir un exemple d'une chaine et son résultat pour mieux comprendre.

Candystand
Candystand
Niveau 10
23 septembre 2016 à 19:21:55

Bon tes segfaults sont du au fait que tu accèdes à des cases de ton tableau qui ne t'appartiennent pas.

Exemple:


if (s1[i] == '-' && (s1[i-1] != ' ' && s1[i+1] != ' ') )

Tu ne gères pas le fait que i vaille 0 car ici tu peux faire une comparaison entre s1[-1] et s1[0]

Ensuite ta condition d'arrêt en EOF? Pourquoi pas tout simplement:

for (i=j=0; s1[i]!='\0'; i++) ou encore for (i=j=0; s1[i]; i++)

lokilok
lokilok
Niveau 17
23 septembre 2016 à 19:23:06

Le 23 septembre 2016 à 19:03:24 -erezan- a écrit :

Le 23 septembre 2016 à 18:59:18 demonyunther a écrit :
Je comprends pas en fait, que dois donner : a-b-c a-z0-9 -a-z
une fois l'appel de la fonction ?

C'est écrit dans l'énoncé.
a-b-c doit donner a-b-c mais a-z doit donner abc...xyz, de même pour 0-9.

Pour moi dans l'énoncé c'est pas très clair, "prévoyez les cas comme a-b-c" ça dit pas ce qu'il faut faire dans ce cas, est-ce qu'il fait interpréter a-b puis b-c ? Est-ce qu'il faut ignorer ? Est-ce qu'il faut interpréter a-b puis ignore b-c ?

Sinon honnêtement ton code est vraiment pas clair, t'as voulu écrire le moins possible et du coup je trouve que c'est assez difficile à relire, genre le "i=j=0" perso je sais pas si ça le fait de gauche à droite ou droite à gauche, "s2[j++] = (s2[j-1]+1);" là non plus je sais pas ce qui évalué en premier, est-ce que quand la partie à droite du égal sera évalué le j++ aura déjà été effectué ou pas ?

Enfin bref, évite d'avoir une instruction qui fait plusieurs choses (pour initialisation dans le for, utilise des virgules pour séparer ce que tu veux initialiser, et pour la ligne dans ta boucle sépare le j++ du reste.

Donc je dois avouer que j'ai pas essayé de comprendre ton code, mais j'suis d'accord avec demonyunther, le caractère de fin de chaine de caractère c'est '\0', EOF c'est le caractère de fin d'un fichier.

Pseudo supprimé
Pseudo supprimé 23 septembre 2016 à 19:26:05

Essaye ca : http://pastebin.com/iFphEJzq

si j'ai bien compris ca doit marcher un peu mieux, après tu peux optimiser.
Mon but était simplement de mieux découper le problème, n'hésite pas à commenter à fond , de rajouter des variables quitte à mieux t'y retrouver. Et après optimiser

ps: y a des petites erreurs dans mon code, mais ca doit te permette d'avancer
la fin par exemple : s2[ j ] = '\0'; au lieu de s2[ j++ ] = '\0';

Message édité le 23 septembre 2016 à 19:28:58 par Pseudo supprimé
Runnymede
Runnymede
Niveau 10
23 septembre 2016 à 20:10:33

Pour identifier toi-même la cause des segfaults, je te conseille d'utiliser des outils de debug, déjà en compilant tes fichiers avec l'option -g de ton compilateur, puis en lançant ton éxecutable comme ceci : valgrind ./developper

-erezan-
-erezan-
Niveau 10
23 septembre 2016 à 21:19:17

Je vous remercie de vos réponses :-)
Je suis en train de regarder un reportage sur la Corée du nord, du coup je regarderais tout ça un peu plus tard

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment