Bonjour,

Tout est dans le titre ou presque. Avec fscanf(), je souhaite lire ma chaine jusqu'à rencontrer un chiffre puis lire le nombre correspondant. J'observe un comportement étonnant avec le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
sscanf(tout, "%[^[0-9]]%d", &texte[0], &nombre);
Si la chaine est correctement lue, le nombre ne l'est pas et je me vois obligé de faire un nouveau sscanf() pour pouvoir le lire.

J'ai essayé plusieurs techniques, qui marchent. J'aimerais comprendre pourquoi la première technique dans le code suivant ne marche pas. Je trouve aussi bizarre que le formateur %n donne 0 avec cette technique.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(void)
{
    const char *tout = "Du texte au debut puis un nomber a lire :42";
 
    char texte[1024] = {0};
    int nombre = 0;
    int nbConv = 0;
    int nbLus = 0;
 
    // Premiere technique
    nbConv = sscanf(tout, "%[^[0-9]]%n%d", &texte[0], &nbLus, &nombre);
    printf("Conv = %d\n", nbConv);
    printf("Texte : [%s]\n", texte);
    printf("Nombre : [%d]\n", nombre);
    nbConv = sscanf(tout + strlen(texte), "%d", &nombre);
    printf("Nombre relu : [%d]\n", nombre);
    printf("%d %d\n\n", strlen((texte)), nbLus);
 
    // Seconde technique
    puts("");
    nbLus = 0;
    nbConv = sscanf(tout, "%[^:] %*c %n %d", &texte[0],&nbLus,  &nombre); // %*c pour passer le double point
    printf("Conv = %d\n", nbConv);
    printf("Texte : [%s]\n", texte);
    printf("Nombre : [%d]\n", nombre);
    printf("%d %d\n\n", strlen((texte)), nbLus);
 
    // Troisieme technique
    puts("");
    nbLus = 0;
    nbConv = sscanf(tout, "%[a-zA-Z :]%n%d", &texte[0],&nbLus,  &nombre);
    printf("Conv = %d\n", nbConv);
    printf("Texte : [%s]\n", texte);
    printf("Nombre : [%d]\n", nombre);
    printf("%d %d\n\n", strlen((texte)), nbLus);
}
Sortie console :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Conv = 1
Texte : [Du texte au debut puis un nomber a lire :]
Nombre : [0]
Nombre relu : [42]
41 0
 
 
Conv = 2
Texte : [Du texte au debut puis un nomber a lire ]
Nombre : [42]
40 41
 
 
Conv = 2
Texte : [Du texte au debut puis un nomber a lire :]
Nombre : [42]
41 41
 
 
Process returned 0 (0x0)   execution time : 0.012 s
Press any key to continue.
Merci d'avance