[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   -
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   Statut Membre Dernière intervention   62
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   62
 
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   Statut Membre Dernière intervention  
 
ok g lis et j'essai merci
0
donomar Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   > donomar Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   62 > donomar Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570 > R4f Messages postés 441 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   62 > lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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   Statut Membre Dernière intervention  
 
ben merci les gars g v tester tout sa tt de suite
0