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

Probleme sprintf

Blaugrana_10
Blaugrana_10
Niveau 30
06 avril 2013 à 16:52:56

Boujour,
Je voudrais formater une chaine avec sprintf pour remplacer un switch un peut trop long. Seulement cela ne fonctionne pas et je ne touve pas mon erreur. Voici mon code :

Ce que je veux remplacer :
char * chemin;
switch(valAleatoire)
{
case 1 :
chemin = "partie/partie1.txt";
break;
..

default:
return 0;

}

Le sprintf : sprintf(chemin, "partie/partie%d.txt", valAleatoire);

Sacahnt que ensuite j'utilise la varaible chemin pour : partie = fopen(chemin, "r+");

Avec le switch sa fonctionne mais pas avec le sprintf

Merci d'avance

Google_Bot
Google_Bot
Niveau 14
06 avril 2013 à 17:00:49

Fais un printf("%s", chemin); juste après le sprintf, pour voir le résultat obtenu.

Je viens de relire un bout de code similaire que j'ai écrit il y a quelques temps,

sprintf(fichierFond, "images/fonds/fond_%d.bmp", hasard(1, NOMBRE_FONDS));

ça fonctionne très bien chez moi... vérifie aussi que valAleatoire est bien un int au lieu d'un long, ou une connerie du genre. (sait-on jamais, quelque fois que le gabarit %d ne soit pas adapté...)

guyver2
guyver2
Niveau 10
07 avril 2013 à 01:14:16

sprintf fait l'hypothèse que tu as deja alloué sufisement de place pour la chaine que tu souhaite ecrire, et en l'occcurence avec le bout de code que tu nous donnes, on voit que tu n'a rien alloué du tout (juste le pointeur).

char chemin[256];
sprintf(chemin, "partie/partie%d.txt", valAleatoire);

pour un truc un peu plus sécurisé, regarde du coté de snprintf.

Paulop
Paulop
Niveau 12
07 avril 2013 à 01:46:52

guyver2 a donné la bonne réponse, avec ton switch tu pointais sur un "string literal" qui est stocké dans le Data segment, le chaine est alloué automatiquement quand le programme se lance donc tu n'avais rien à faire.

Maintenant tu veux faire un sprintf qui va chercher à écrire sur sa destination, ici chemin, si tu n'as rien alloué et que ton pointeur n'est pas initialisé, il va écrire quelque part et le résultat est je pense undefined.

chris_27
chris_27
Niveau 10
07 avril 2013 à 12:21:25

J'ajouterai qu'il vaut mieux utiliser snprintf, histoire de s'assurer qu'on écrit que dans un espace correctement alloué. :oui:

Blaugrana_10
Blaugrana_10
Niveau 30
07 avril 2013 à 15:59:32

Merci tout le monde, en effet vous avez raison, j'ai même trouvé mon erreur hier tout seul.
Mais merci pour vos explications et vos reponses

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