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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part sscanf(tout, "%[^[0-9]]%d", &texte[0], &nombre);
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.
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
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); }
Merci d'avance
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.
Partager