[C] Traitement chaîne de caractères
Fermé
donomar
Messages postés
8
Date d'inscription
vendredi 18 avril 2008
Statut
Membre
Dernière intervention
26 avril 2008
-
18 avril 2008 à 11:32
R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008 - 18 avril 2008 à 17:03
R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008 - 18 avril 2008 à 17:03
A voir également:
- [C] Traitement chaîne de caractères
- Caractères ascii - Guide
- Chaine tnt gratuite sur mobile - Guide
- Caractères spéciaux clavier azerty - Guide
- Caractères spéciaux - Guide
- Plus de chaine tv - Guide
5 réponses
R4f
Messages postés
441
Date d'inscription
dimanche 13 janvier 2008
Statut
Membre
Dernière intervention
5 mai 2008
62
18 avril 2008 à 12:22
18 avril 2008 à 12:22
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
donomar
Messages postés
8
Date d'inscription
vendredi 18 avril 2008
Statut
Membre
Dernière intervention
26 avril 2008
18 avril 2008 à 12:26
18 avril 2008 à 12:26
oui je suis obligé de le faire en C.il s'agit d'un projet scolaire
R4f
Messages postés
441
Date d'inscription
dimanche 13 janvier 2008
Statut
Membre
Dernière intervention
5 mai 2008
62
18 avril 2008 à 12:27
18 avril 2008 à 12:27
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
donomar
Messages postés
8
Date d'inscription
vendredi 18 avril 2008
Statut
Membre
Dernière intervention
26 avril 2008
18 avril 2008 à 12:29
18 avril 2008 à 12:29
ok g lis et j'essai merci
donomar
Messages postés
8
Date d'inscription
vendredi 18 avril 2008
Statut
Membre
Dernière intervention
26 avril 2008
>
donomar
Messages postés
8
Date d'inscription
vendredi 18 avril 2008
Statut
Membre
Dernière intervention
26 avril 2008
18 avril 2008 à 12:39
18 avril 2008 à 12:39
euh c'est encore moi. excuser moi de vous deranger encore plus longtemps.mais n'y a t il pas un moyen de s'en sortir avec des printf et sscanf et strcopy?g vien de consulter le lien et j'ai pas compris grand chose.je suis encore un debutant en C
R4f
Messages postés
441
Date d'inscription
dimanche 13 janvier 2008
Statut
Membre
Dernière intervention
5 mai 2008
62
>
donomar
Messages postés
8
Date d'inscription
vendredi 18 avril 2008
Statut
Membre
Dernière intervention
26 avril 2008
18 avril 2008 à 14:09
18 avril 2008 à 14:09
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)
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
>
R4f
Messages postés
441
Date d'inscription
dimanche 13 janvier 2008
Statut
Membre
Dernière intervention
5 mai 2008
18 avril 2008 à 14:19
18 avril 2008 à 14:19
Hello,
je n'ai pas pensé à une solution générique, puisque la question ne l'était pas ;-))
ta solution, m'evite de travailler plus ;-)) (je suis très paresseux môa ;-)
je n'ai pas pensé à une solution générique, puisque la question ne l'était pas ;-))
ta solution, m'evite de travailler plus ;-)) (je suis très paresseux môa ;-)
R4f
Messages postés
441
Date d'inscription
dimanche 13 janvier 2008
Statut
Membre
Dernière intervention
5 mai 2008
62
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
18 avril 2008 à 14:29
18 avril 2008 à 14:29
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
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
18 avril 2008 à 13:58
18 avril 2008 à 13:58
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
donomar
Messages postés
8
Date d'inscription
vendredi 18 avril 2008
Statut
Membre
Dernière intervention
26 avril 2008
18 avril 2008 à 15:21
18 avril 2008 à 15:21
ben merci les gars g v tester tout sa tt de suite
18 avril 2008 à 14:05
et en une seule ligne ;-))