Difficulté utilisation sscanf_s

Résolu/Fermé
Theo_2059 Messages postés 37 Date d'inscription vendredi 5 juillet 2019 Statut Membre Dernière intervention 22 février 2023 - 8 sept. 2022 à 23:41
[Dal] Messages postés 6195 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 décembre 2024 - 13 sept. 2022 à 21:56

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.

3 réponses

yg_be Messages postés 23373 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 décembre 2024 Ambassadeur 1 556
Modifié le 9 sept. 2022 à 07:14

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

0
[Dal] Messages postés 6195 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 décembre 2024 1 092
Modifié le 9 sept. 2022 à 16:13

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.

0
Theo_2059 Messages postés 37 Date d'inscription vendredi 5 juillet 2019 Statut Membre Dernière intervention 22 février 2023
Modifié le 10 sept. 2022 à 10:58

Bonjour à vous. Merci d'avoir pris le temps de me répondre ! Je vais essayer ce que vous m'avez dit. Merci.

Theo

0
[Dal] Messages postés 6195 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 décembre 2024 1 092
13 sept. 2022 à 21:56

Si ton problème est résolu, peux-tu mettre ton sujet en "résolu" (clique sur les "..." en bas de ton sujet initial).

0