[C] Traitement chaîne de caractères
donomar
Messages postés
8
Statut
Membre
-
R4f Messages postés 441 Statut Membre -
R4f Messages postés 441 Statut Membre -
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
Configuration: Windows XP Internet Explorer 7.0
5 réponses
-
Salut donomar,
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-
Salut,
et en une seule ligne ;-))root@debian:~# cat fichier.txt L'Abergement-Clémenciat L ABERGEMENT CLEMENCIAT 1400 1001 82 46.15 4.916667 1.46 root@debian:~# perl -ne '($ville,$lat,$long)=(split /\s+/,$_)[0,7,8];print "$ville $lat $long\n"' fichier.txt L'Abergement-Clémenciat 46.15 4.916667 root@debian:~#
-
-
oui je suis obligé de le faire en C.il s'agit d'un projet scolaire
-
Tu peux utiliser les expressions régulières en C :
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) :# 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
-
-
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 -