Difficulté utilisation sscanf_s
Résolu[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
Bonsoir,
Ca fait un moment que j'essaie d'afficher des élements d'une ligne d'un fichier texte en utilisant sscanf_s. Malheureusement j'arrive à afficher le premier élément de la ligne, puis les suivants sont des caractères incompréhensibles. Faut aussi savoir que c'est peut etre une erreur d'utilisation des pointeurs... Honnêtement même après beaucoup d'explications, je galère encore avec cette notion.
Voici mon code et le résultat.
Voici mon fichier texte que je dois lire : "annuaire.txt"
Martin Jean 19 M 0627345674
Dupond Pascal 22 M 0727345674
Simon Jeanne 20 F 0722145674
Voici mon main.c dans lequel je fais mon sscanf_s.
#include <stdio.h> #define MAX_LENGTH 200 void lireannuaire(); FILE * file; char * stat_file = (char *)0; char ligne[MAX_LENGTH]; int main() { lireannuaire(); return 0; } void lireannuaire() { char nom[31]; char prenom[31]; int age; char sexe; long int numTel; stat_file = "C:\\Users\\Anwender\\CLionProjects\\untitled1\\annuaire.txt"; file = fopen(stat_file, "r+"); if (file == NULL) { fputs("Erreur d'ouverture\n", stderr); } else { fgets(ligne, MAX_LENGTH, file); sscanf_s(ligne, "%30s, %30s, %d, %c, %li", nom, prenom, &age, &sexe, &numTel); printf("%s", ligne); printf("%s", prenom); } }
Et voici le retour lorsque je souhaite lire le prenom (sachant que le nom, lui, est bien lu) :
C:\Users\Anwender\CLionProjects\untitled1\cmake-build-debug\untitled1.exe
Martin Jean 19 M 0627345674
á³ Âä
Process finished with exit code 0
Merci par avance ! bonne soirée.
- Difficulté utilisation sscanf_s
- Utilisation chromecast - Guide
- Télécharger gratuitement notice d'utilisation - Guide
- Manuel utilisation batigest connect pdf - Forum compta / gestion
- La ressource demandée est en cours d'utilisation ✓ - Forum Logiciels
- Family link temps d'utilisation ne fonctionne pas - Forum Contrôle parental
3 réponses
bonjour,
moi je ferais plutôt:
sscanf_s(ligne, "%30s, %30s, %d, %c, %li", nom, 31, prenom, 31, &age, &sexe, 1, &numTel);
Explications: https://docs.microsoft.com/fr-fr/cpp/c-runtime-library/reference/sscanf-s-sscanf-s-l-swscanf-s-swscanf-s-l?view=msvc-170
Salut Theo_2059,
Je suppose que tu dois certainement utiliser Microsoft Visual Studio pour tenter de compiler ton code C et que tu as probablement d'abord tenté d'utiliser l'instruction standard du C sscanf().
Lorsque tu fais cela, Microsoft décrète que cette fonction serait "obsolète" et t'invite à utiliser sscanf_s() à la place en refusant de compiler ton code avec une erreur comme celle-ci :
Error 1 error C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Comme l'a expliqué yg_be, les paramètres à passer à sscanf_s() sont alors différents de ceux de sscanf() et doivent inclure des indications de taille de buffer maximales pour certains types, sinon, ton appel à la fonction de remplacement réputée plus "sûre" ne fonctionnera pas.
Toutefois, si tu veux utiliser sscanf(), qui n'est pas obsolète dans le langage C et est parfaitement supportée dans les standards à jour de ce langage, tu peux forcer le compilateur à accepter ton instruction sscanf() (et d'autres que Microsoft a décidé toute seule de "bannir" faisant que du code parfaitement légal en C standard ne compile pas chez eux par défaut) en suivant l'indication fournie dans le message d'erreur.
En suivant cette indication, pour que le compilateur de Microsoft ne t'empêche plus d'utiliser ces fonctions du langage C, il te suffit de mettre ce #define au tout début de ton code :
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #define MAX_LENGTH 200 (suite de ton code)
Alternativement, tu peux aussi mettre une ligne
#pragma warning(disable:4996)
et tu pourras désormais utiliser sscanf() avec la syntaxe que tu connais, mais aussi scanf() et plein d'autres fonctions du langage C, par exemple de manipulation de chaîne comme strcpy() que Microsoft a décidé de rendre indisponibles par défaut.