[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
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
A voir également:

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
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
0
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 à 14:05
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:~#
0
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
oui je suis obligé de le faire en C.il s'agit d'un projet scolaire
0
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
Tu peux utiliser les expressions régulières en C :

https://nicolasj.developpez.com/articles/regex/#LIV-B
0
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
ok g lis et j'essai merci
0
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
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
0
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
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)
0
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
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 ;-)
0
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
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
0
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
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:~#
0

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
ben merci les gars g v tester tout sa tt de suite
0