Comment faire une boucle dans un sscanf ?

Fermé
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017 - Modifié par geekat le 31/01/2016 à 14:35
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017 - 8 févr. 2016 à 15:15
Bonjour,
J'aimerais optimiser l'écriture de mon code, le souci c'est que je réécris 4 fois une variable correspondant à 4 colonne de chaque ligne (à chaque incrémentation).
Maintenant, j'aimerais n'écrire qu'une seule fois cette variable en la mettant dans une boucle jusqu'à en avoir 4.
Je ne sais pas comment faire une boucle dans un sscanf.
Code non optimisé :
sscanf(chaine, "%lf ,%lf ,%lf ,%lf", &vect[i][0], &vect[i][1], &vect[i][2], &vect[i][3]);
printf("Le vecteur de donnees x%d est : %f,%f,%f,%f \n",i, vect[i][0], vect[i][1], vect[i][2], vect[i][3]);

Code que j'ai essayé mais qui ne marche pas bien :
int j;
for(j=0;j<=4;j++)
    {
      sscanf(chaine, "%lf", &vect[i][j]);
      printf("Le vecteur de donnees x%d est : %f \n",i, vect[i][j]); 
     }

Pouvez-vous m'aider ?
Merci

2 réponses

[Dal] Messages postés 6202 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 14 janvier 2025 1 097
Modifié par [Dal] le 1/02/2016 à 12:48
Salut geekat,

Peux-tu donner un exemple de ce qui figure dans "chaine" ?

Dans ton premier code, tu mets "%lf ,%lf ,%lf ,%lf", alors que dans le second, il n'y a pas d'espace suivi d'une virgule de consommés dans la lecture faite par sscanf.

Par ailleurs, si tu sais qu'il en a 4, je ne vois pas pourquoi le premier code ne serait pas "optimisé", surtout compte tenu de ce que tes caractères séparateurs, bien que bizarres (un espace suffit, non ?), sont pris en charge.

Si les valeurs n'étaient séparées que par un espace, le 2ème code fonctionnerait probablement.


Dal
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
1 févr. 2016 à 23:15
Salut [Dal],

Pas besoin d'espaces entre les %lf pour lire les variables.
C'est facultatif.

A+
0
[Dal] Messages postés 6202 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 14 janvier 2025 1 097
Modifié par [Dal] le 2/02/2016 à 11:24
Salut fiddy,

hmm..., oui, mais comme il y a un espace suivi d'une virgule dans le masque il faut qu'il y ait une cohérence entre le masque et le contenu de la chaîne (c'est pourquoi je lui demande de confirmer quel est le contenu de la chaîne).

#include <stdio.h>

int main(void) {
    double a, b, c, d;

    /* ici tout va bien car il n'y a que des 
     * espaces séparateurs dans la chaîne */
    char st1[] = "12 13 14 15";
    if (sscanf(st1, "%lf%lf%lf%lf", &a, &b, &c, &d) == 4) {
        printf("cas 1 - pour st1 : a = %f ; b = %f ; c = %f ; d = %f\n", a, b, c, d);
    } else
        printf("Erreur cas 1\n");
    /* ici aussi car bien qu'il y ait des virgules en plus des 
     * espaces, le masque passé à sscanf correspond */
    char st2[] = "12 ,13 ,14 ,15";
    if (sscanf(st2, "%lf ,%lf ,%lf ,%lf", &a, &b, &c, &d) == 4) {
        printf("cas 2 - pour st2 (avec espaces et virgules) : a = %f ; b = %f ; c = %f ; d = %f\n", a, b, c, d);
    } else
        printf("Erreur cas 2\n");
    /* si on omet les espaces dans le masque, cela ne va plus */
    if (sscanf(st2, "%lf,%lf,%lf,%lf", &a, &b, &c, &d) == 4) {
        printf("cas 3 - pour st2 (avec virgules et sans espaces) : a = %f ; b = %f ; c = %f ; d = %f\n", a, b, c, d);
    } else
        printf("Erreur cas 3\n");

    return 0;
}

donne :

cas 1 - pour st1 : a = 12.000000 ; b = 13.000000 ; c = 14.000000 ; d = 15.000000
cas 2 - pour st2 (avec espaces et virgules) : a = 12.000000 ; b = 13.000000 ; c = 14.000000 ; d = 15.000000
Erreur cas 3

Dal
0
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017
8 févr. 2016 à 15:15
Merci pour vos réponses ;)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
1 févr. 2016 à 23:14
Bonjour,

Attention à la cohérence entre tes sscanf(). Comme dit [Dal], dans le premier tu as mis "%lf, %lf..." et dans le second, tu considères : "%lf %lf ...".

for(j=0;j<=4;j++)
Attention, tu as mis j==4 comme valeur max. Mais le dernier indice est 3...

Sinon, tu as utilisé la bonne méthode.
Qu'est-ce qui te fait dire que ça ne fonctionne pas ?

Cdlt,
0
[Dal] Messages postés 6202 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 14 janvier 2025 1 097
2 févr. 2016 à 11:25
A la réflexion, je pense que sa boucle ne va lire que la 1ère valeur 4 fois... ce n'est pas fscanf ...
0