[C] Traitement chaîne de caractères
donomar
Messages postés
8
Date d'inscription
Statut
Membre
Dernière intervention
-
R4f Messages postés 441 Date d'inscription Statut Membre Dernière intervention -
R4f Messages postés 441 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Bonjour,
voila j'ai une chaine de caractère du genre
(L'Abergement-Clémenciat L ABERGEMENT CLEMENCIAT 1400 1001 82 46.15 4.916667 1.46)
et j'aimerai pouvoir recuperer
(L'Abergement-Clémenciat 46.15 4.916667) et le sauvegarder sous forme de structure.comment pourrais-je faire???:'(:'(..............heu petite precision je suis encore debutant en C.Merci d'avance pour votre aide
Bonjour,
voila j'ai une chaine de caractère du genre
(L'Abergement-Clémenciat L ABERGEMENT CLEMENCIAT 1400 1001 82 46.15 4.916667 1.46)
et j'aimerai pouvoir recuperer
(L'Abergement-Clémenciat 46.15 4.916667) et le sauvegarder sous forme de structure.comment pourrais-je faire???:'(:'(..............heu petite precision je suis encore debutant en C.Merci d'avance pour votre aide
A voir également:
- [C] Traitement chaîne de caractères
- Reconsidérer le traitement de vos informations à des fins publicitaires - Accueil - Réseaux sociaux
- Caractères ascii - Guide
- Caractères spéciaux - Guide
- Chaine tnt gratuite sur mobile - Guide
- Traitement de texte gratuit - Guide
5 réponses
Salut donomar,
Tu es obligé de le faire en C ?
Parce qu'en Perl, je te fais ça en 2 lignes :
(J'ai testé, ça mache...)
Raph
Tu es obligé de le faire en C ?
Parce qu'en Perl, je te fais ça en 2 lignes :
my $var = "(L'Abergement-Clémenciat L ABERGEMENT CLEMENCIAT 1400 1001 82 46.15 4.916667 1.46)"; my ($nomville, $lat, $long) = $var =~ /\((\S+).*\s(\S+)\s(\S+)\s\S+\)/; print "($nomville $lat $long)\n"; print "(L'Abergement-Clémenciat 46.15 4.916667) correction\n";
(J'ai testé, ça mache...)
Raph
Tu peux utiliser les expressions régulières en C :
https://nicolasj.developpez.com/articles/regex/#LIV-B
https://nicolasj.developpez.com/articles/regex/#LIV-B
La réponse de lami20j est sympa, mais ça ne va marcher qu'avec "L ABERGEMENT CLEMENCIAT " et pas d'autres villes...
Je te propose une solution (plus compliquée mais plus générique) :
Ca marche :
Je te propose une solution (plus compliquée mais plus générique) :
# include <stdio.h> #include <string.h> #include <stdlib.h> main() { char *chaine = "(L'Abergement-Clémenciat L ABERGEMENT CLEMENCIAT 1400 1001 82 46.15 4.916667 1.46)"; printf("%s\n", chaine); int i = 0, j = 0, cpt_mots = 0; int taille = strlen(chaine); char buff[100]; char *resultats[100]; char c; for(i=0; i < taille; i++) { if (chaine[i] != ' ') { c=chaine[i]; buff[j] = c; j++; } else { buff[j] = '\0'; resultats[cpt_mots] = malloc(j+1); strcpy(resultats[cpt_mots], buff); /* nouvelle entree dans resultats */ j=0; /* remise a zero pour le buffer */ cpt_mots++; } } buff[j] = '\0'; resultats[cpt_mots] = malloc(j+1); strcpy(resultats[cpt_mots], buff); /* nouvelle entree dans resultats */ j=0; /* remise a zero pour le buffer */ for(i=0; i <= cpt_mots; i++) { printf("%d: %s\n", i, resultats[i]); } char *nom_ville; nom_ville = malloc(strlen(resultats[0]) + 1); strcpy(nom_ville, resultats[0]); char *lat_ville; int index_lat = cpt_mots - 2; lat_ville = malloc(strlen(resultats[index_lat]) + 1); strcpy(lat_ville, resultats[index_lat]); char *lon_ville; int index_lon = cpt_mots - 1; lon_ville = malloc(strlen(resultats[index_lon]) + 1); strcpy(lon_ville, resultats[index_lon]); printf("%s %s %s)", nom_ville, lat_ville, lon_ville); free(nom_ville); free(lat_ville); free(lon_ville); for(i=0; i <= cpt_mots; i++) { free(resultats[i]); } }
Ca marche :
$ gcc testC.c $ ./a.out (L'Abergement-Clémenciat L ABERGEMENT CLEMENCIAT 1400 1001 82 46.15 4.916667 1.46) 0: (L'Abergement-Clémenciat 1: L 2: ABERGEMENT 3: CLEMENCIAT 4: 1400 5: 1001 6: 82 7: 46.15 8: 4.916667 9: 1.46) (L'Abergement-Clémenciat 46.15 4.916667)
Ce n'était pas un reproche lami20j !
Je vois juste dans quel contexte se situe son exo et je suppose qu'il y a plusieurs lignes à gérer, pas seulement celle-là, sinon on a plus vite fait de faire un copier coller à la main que de faire un programme qui fasse ça tout seul...
L'avantage de ta solution, c'est que tu as fait la lecture dans un fichier, alors que moi je me suis contenté de mettre directement la chaîne en dur dans le fichier.
Un mix des 2 devrait bien faire l'affaire !!!
Raph
Je vois juste dans quel contexte se situe son exo et je suppose qu'il y a plusieurs lignes à gérer, pas seulement celle-là, sinon on a plus vite fait de faire un copier coller à la main que de faire un programme qui fasse ça tout seul...
L'avantage de ta solution, c'est que tu as fait la lecture dans un fichier, alors que moi je me suis contenté de mettre directement la chaîne en dur dans le fichier.
Un mix des 2 devrait bien faire l'affaire !!!
Raph
Salut,
root@debian:~# cat fichier.txt L'Abergement-Clémenciat L ABERGEMENT CLEMENCIAT 1400 1001 82 46.15 4.916667 1.46 root@debian:~# cat chaine.c #include<stdio.h> int main () { FILE *fic; fic = fopen ("fichier.txt", "r"); char nom[30]; char vide[30]; char a[20], b[20]; while (!feof (fic)) fscanf (fic, "%s %s %s %s %s %s %s %s %s %s", nom, vide, vide, vide, vide, vide, vide, a, b, vide); printf ("%s = %s = %s\n", nom, a, b); return 0; } root@debian:~# gcc chaine.c root@debian:~# ./a.out L'Abergement-Clémenciat = 46.15 = 4.916667 root@debian:~#
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
et en une seule ligne ;-))