3 votes

C analyse syntaxique d'une chaîne de caractères divisée

Je déteste être le type qui pose des questions faciles, mais je suis un peu rouillé dans mon C et quelque chose m'échappe ici. J'essaie de lire un fichier contenant l'exemple de texte suivant :

    23# 1110.00:1000.00,120.00:1110.00,1190.00:900.00,-52.98,-53.21

Je veux séparer en plusieurs chaînes les éléments divisés par le cardinal et les virgules, mais dans ma console, je n'obtiens aucun résultat.

    #include <stdio.h>   /* required for file operations */
    #include <conio.h>  /* for clrscr */
    #include <dos.h>  /* for delay */

    FILE *fr;            /* declare the file pointer */

    #include <stdio.h>
    int main(void)
    {
        char output[200];
        const char filename[] = "file.txt";
        FILE *file = fopen(filename, "r");
        if ( file )
        {
            char line [ BUFSIZ ];
            while ( fgets(line, sizeof line, file) )
            { printf(" %s \n", line);

                char * i[80],pt1[80], pt2[80], pt3[80], tp1[80], tp2[80];
                if ( sscanf(line, "%s# %s,%s,%s,%s,%s",
                        &i, &pt1, &pt2, &pt3, &tp1, &tp2) == 6 )
                {
                    snprintf(output, sizeof output,
                            "Leitura:=%s,PT1=%s,PT2=%s,PT3=%s,TP1=%s,TP2=%s,",
                            i, pt1, pt2, pt3, tp1, tp2);
                    puts(output);
                }
            }
        }
        else
        {
            perror(filename);
        }
        return 0;
    }

6voto

hmjd Points 76411

Le problème est que sscanf() ne traitera pas # ou , comme délimiteurs, seulement des espaces blancs. Cela signifie que "%s" lirait "1110.00:1000.00,120.00:1110.00,1190.00:900.00,-52.98,-53.21" entièrement, ce qui peut entraîner un dépassement de la mémoire tampon et certainement 6 n'étant pas le résultat.

Une solution consiste à utiliser des ensembles de balayage :

if (sscanf(line,
           "%79[^#]# %79[^,],%79[^,],%79[^,],%79[^,],%s",
           i,
           pt1,
           pt2,
           pt3,
           tp1,
           tp2) == 6 )

En outre, la déclaration de i n'est pas correct :

char * i[80],pt1[80], pt2[80], pt3[80], tp1[80], tp2[80];

car il fait i un tableau de 80 char* . Changer pour :

char i[80],pt1[80], pt2[80], pt3[80], tp1[80], tp2[80];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X