Prgm qui supprime le \n d'une chaine (en C)
Résolu/Fermé
Thom@s
-
15 avril 2012 à 20:11
p3t3r42 Messages postés 74 Date d'inscription mardi 18 janvier 2011 Statut Membre Dernière intervention 2 février 2014 - 15 avril 2012 à 21:35
p3t3r42 Messages postés 74 Date d'inscription mardi 18 janvier 2011 Statut Membre Dernière intervention 2 février 2014 - 15 avril 2012 à 21:35
A voir également:
- Prgm tv
- Fast tv - Guide
- Pas de signal tv - Guide
- Installer chromecast sur tv - Guide
- Live match tv gratuit - Guide
- Free tv player - Télécharger - Télévision
4 réponses
p3t3r42
Messages postés
74
Date d'inscription
mardi 18 janvier 2011
Statut
Membre
Dernière intervention
2 février 2014
28
15 avril 2012 à 20:38
15 avril 2012 à 20:38
Bonjour,
essaie de remplacer ce tableau :
char chaine_sans_retour_a_la_ligne[TAILLE_MAX];
par un pointeur :
char *chaine_sans_retour_a_la_ligne;
Sache qu'après cet ligne :
chaine_sans_retour_a_la_ligne=Suprime_retour_a_la_ligne(chaine_avec_retour_a_la_ligne);
chaine_sans_retour_a_la_ligne contient la même chaine que chaine_avec_retour_a_la_ligne, car dans ta fonction tu modifie chaine_avec_retour_a_la_ligne et tu renvoie une copie de son pointeur vers chaine_sans_retour_a_la_ligne.
PS:tes nom de variables et de fonctions son relativement long, ce n'est pas facile à lire et avec des noms plus cours tu augmenterai ton rendement ;)
essaie de remplacer ce tableau :
char chaine_sans_retour_a_la_ligne[TAILLE_MAX];
par un pointeur :
char *chaine_sans_retour_a_la_ligne;
Sache qu'après cet ligne :
chaine_sans_retour_a_la_ligne=Suprime_retour_a_la_ligne(chaine_avec_retour_a_la_ligne);
chaine_sans_retour_a_la_ligne contient la même chaine que chaine_avec_retour_a_la_ligne, car dans ta fonction tu modifie chaine_avec_retour_a_la_ligne et tu renvoie une copie de son pointeur vers chaine_sans_retour_a_la_ligne.
PS:tes nom de variables et de fonctions son relativement long, ce n'est pas facile à lire et avec des noms plus cours tu augmenterai ton rendement ;)
p3t3r42
Messages postés
74
Date d'inscription
mardi 18 janvier 2011
Statut
Membre
Dernière intervention
2 février 2014
28
15 avril 2012 à 21:01
15 avril 2012 à 21:01
Voilà ce que j'aurais fait à ta place ^^ (je n'ai pas essayer de compiler, il peut y avoir des petites erreurs de syntax ou autres :$):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAILLE_MAX 100
char* supprimerRL(char chaine[]);
int main(int argc, char *argv[])
{
char chaine[TAILLE_MAX]="Il y a un retour a la ligne:\n", *resultat
;
resultat = supprimerRL(chaine); // appel de la fonction ...
printf("%s%s...", chaine, resultat); // et verification ^^
return 0; // Pourquoi tu ne l'as pas mis ? o_O
}
char* supprimerRL(char chaine[])
{
char nouvelleChaine[TAILLE_MAX], retour_a_la_ligne;
strcpy(nouvelleChaine, chaine);// on copie la chaîne donnée en paramètre pour qu'on puisse ensuite modifier la copie sans modifier celle en paramètre...
retour_a_la_ligne=strrchr(nouvelleChaine, '\n'); // on obtient un pointeur vers le '\n' ...
if(retour_a_la_ligne != NULL)// ... si le '\n' n'existe pas, retour_a_la_ligne = NULL...
{
retour_a_la_ligne[] = '\0'; // ... et ça planterai ^^
}
return nouvelleChaine; // on renvoie la chaîne copiée et modifiée
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAILLE_MAX 100
char* supprimerRL(char chaine[]);
int main(int argc, char *argv[])
{
char chaine[TAILLE_MAX]="Il y a un retour a la ligne:\n", *resultat
;
resultat = supprimerRL(chaine); // appel de la fonction ...
printf("%s%s...", chaine, resultat); // et verification ^^
return 0; // Pourquoi tu ne l'as pas mis ? o_O
}
char* supprimerRL(char chaine[])
{
char nouvelleChaine[TAILLE_MAX], retour_a_la_ligne;
strcpy(nouvelleChaine, chaine);// on copie la chaîne donnée en paramètre pour qu'on puisse ensuite modifier la copie sans modifier celle en paramètre...
retour_a_la_ligne=strrchr(nouvelleChaine, '\n'); // on obtient un pointeur vers le '\n' ...
if(retour_a_la_ligne != NULL)// ... si le '\n' n'existe pas, retour_a_la_ligne = NULL...
{
retour_a_la_ligne[] = '\0'; // ... et ça planterai ^^
}
return nouvelleChaine; // on renvoie la chaîne copiée et modifiée
}
En fait, ce programme n'est qu'une fonction de mon programme (d'où mon oubli du return 0). Cependant, lorsque je l'adapte a mon programme, la première lettre de la chaine est modifiée, et je ne comprend pas pourquoi. Voici mon programme en entier (les passages en gras sont ceux concernés):
Source:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "main.h"
#define TAILLE_MAX_CHAINE 100
int main(int argc, char *argv[])
{
//On demande le nombre de joueurs
Personne joueur[100];
int i=0, compteur=0;
for (i=0; i<100; i++)
{
Initialiser_structure_Personne(&joueur[compteur]);
compteur++;
}
int nombre_de_joueurs=0;
i=0;
compteur=0;
do
{
printf("Combien y a-t-il de joueurs (100 max, 1 min)? ");
scanf("%d", &nombre_de_joueurs);
}while (nombre_de_joueurs<1||nombre_de_joueurs>100);
//demande les infos sur le(s) joueur(s)
for (i=0; i<nombre_de_joueurs; i++)
{
compteur++;
printf("\nJoueur %d\n", compteur);
joueur[i]=Infos_joueur();
}
compteur=0;
//stocker les infos reçues
FILE *fichier_infos_joueurs=NULL;
fichier_infos_joueurs=fopen("infos joueurs.txt", "w+");
fprintf(fichier_infos_joueurs, "Infos sur les joueurs\n");
fclose(fichier_infos_joueurs);
for (i=0; i<nombre_de_joueurs; i++)
{
compteur++;
fichier_infos_joueurs=fopen("infos joueurs.txt", "a");
fprintf(fichier_infos_joueurs,"\nJoueur %d", compteur);
fclose(fichier_infos_joueurs);
stocke_infos_joueurs(joueur[i]);
}
compteur=0;
//Affiche les infos sur le(s) joueur(s)
for(i=0; nombre_de_joueurs>i; i++)
{
compteur++;
Affiche_infos(compteur);
}
compteur=0;
return 0;
}
Headers:
#ifndef DEF_MAIN
#define DEF_MAIN
#define TAILLE_MAX_CHAINE 100
typedef struct Personne Personne;
struct Personne
{
char prenom[TAILLE_MAX_CHAINE];
char nom[TAILLE_MAX_CHAINE];
int age;
char ville[TAILLE_MAX_CHAINE];
char adresse[TAILLE_MAX_CHAINE];
};
void Initialiser_structure_Personne(Personne* joueur);
Personne Infos_joueur();
void stocke_infos_joueurs(const Personne joueur_temp);
void Affiche_infos(const int numero_joueur);
Personne Recherche_infos_joueurs(const int numero_joueur);
char* Suprime_retour_a_la_ligne(char chaine_a_modifier[]);
//Initialiser la structure Personne
void Initialiser_structure_Personne(Personne* joueur)
{
(*joueur).age = 0;
}
//definit les infos sur un personnage
Personne Infos_joueur()
{
Personne joueur_temporel;
printf("Votre prenom: ");
scanf("%s", joueur_temporel.prenom);
printf("%s comment? %s ", joueur_temporel.prenom, joueur_temporel.prenom);
scanf("%s", joueur_temporel.nom);
printf("Quel est votre age %s %s? ", joueur_temporel.prenom, joueur_temporel.nom);
scanf("%d", &joueur_temporel.age);
printf("Vous habitez a (ville): ");
scanf("%s", joueur_temporel.ville);
printf("Votre adresse est: ");
scanf("%s", joueur_temporel.adresse);
return joueur_temporel;
}
//Stocke les infos su un joueur
void stocke_infos_joueurs(const Personne joueur_temp)
{
FILE *fichier_infos_joueurs=NULL;
fichier_infos_joueurs=fopen("infos joueurs.txt", "a");
fprintf(fichier_infos_joueurs, "\nPrenom\n%s\nNom\n%s\nAge\n%d\nVille\n%s\nAdresse\n%s\n", joueur_temp.prenom, joueur_temp.nom, joueur_temp.age, joueur_temp.ville, joueur_temp.adresse);
fclose(fichier_infos_joueurs);
}
//affiche les infos sur un joueur
void Affiche_infos(const int numero_joueur)
{
Personne joueur;
joueur=Recherche_infos_joueurs(numero_joueur);
printf("\nFiche d'identite\n=================\nNom: %s\nPrenom: %s\nAge: %d\nVille: %s\nAdresse: %s\n\n", joueur.nom, joueur.prenom, joueur.age, joueur.ville, joueur.adresse);
}
//Rechereche les infos sur un joueur
Personne Recherche_infos_joueurs(const int numero_joueur)
{
FILE *fichier_infos_joueurs=NULL;
Personne joueur;
char chaine_temp[TAILLE_MAX_CHAINE]="",message_numero_joueur[TAILLE_MAX_CHAINE]="";
sprintf(message_numero_joueur,"Joueur %d\n", numero_joueur);
fichier_infos_joueurs=fopen("infos joueurs.txt", "r");
rewind(fichier_infos_joueurs);
while(strcmp(chaine_temp , message_numero_joueur)!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
//Recherche le prenom
while(strcmp(chaine_temp , "Prenom\n")!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
fgets(joueur.prenom, TAILLE_MAX_CHAINE, fichier_infos_joueurs);
joueur.prenom[0]=Suprime_retour_a_la_ligne(joueur.prenom);
//Recherche le Nom
while(strcmp(chaine_temp , "Nom\n")!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
fgets(joueur.nom, TAILLE_MAX_CHAINE,fichier_infos_joueurs);
joueur.nom[0]=Suprime_retour_a_la_ligne(joueur.nom);
//recherche l'age
while(strcmp(chaine_temp , "Age\n")!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
fscanf(fichier_infos_joueurs, "%d", &joueur.age);
//Recherche la ville
while(strcmp(chaine_temp , "Ville\n")!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
fgets(joueur.ville, TAILLE_MAX_CHAINE, fichier_infos_joueurs);
joueur.ville[0]=Suprime_retour_a_la_ligne(joueur.ville);
//Recherche l'adresse
while(strcmp(chaine_temp , "Adresse\n")!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
fgets(joueur.adresse,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
joueur.adresse[0]=Suprime_retour_a_la_ligne(joueur.adresse);
return joueur;
}
char* Suprime_retour_a_la_ligne(char chaine_a_modifier[])
{
char* retour_a_la_ligne=NULL;
retour_a_la_ligne=strrchr(chaine_a_modifier, '\n');
retour_a_la_ligne[0]='\0';
return chaine_a_modifier;
}
#endif
Merci de vos réponses!
Source:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "main.h"
#define TAILLE_MAX_CHAINE 100
int main(int argc, char *argv[])
{
//On demande le nombre de joueurs
Personne joueur[100];
int i=0, compteur=0;
for (i=0; i<100; i++)
{
Initialiser_structure_Personne(&joueur[compteur]);
compteur++;
}
int nombre_de_joueurs=0;
i=0;
compteur=0;
do
{
printf("Combien y a-t-il de joueurs (100 max, 1 min)? ");
scanf("%d", &nombre_de_joueurs);
}while (nombre_de_joueurs<1||nombre_de_joueurs>100);
//demande les infos sur le(s) joueur(s)
for (i=0; i<nombre_de_joueurs; i++)
{
compteur++;
printf("\nJoueur %d\n", compteur);
joueur[i]=Infos_joueur();
}
compteur=0;
//stocker les infos reçues
FILE *fichier_infos_joueurs=NULL;
fichier_infos_joueurs=fopen("infos joueurs.txt", "w+");
fprintf(fichier_infos_joueurs, "Infos sur les joueurs\n");
fclose(fichier_infos_joueurs);
for (i=0; i<nombre_de_joueurs; i++)
{
compteur++;
fichier_infos_joueurs=fopen("infos joueurs.txt", "a");
fprintf(fichier_infos_joueurs,"\nJoueur %d", compteur);
fclose(fichier_infos_joueurs);
stocke_infos_joueurs(joueur[i]);
}
compteur=0;
//Affiche les infos sur le(s) joueur(s)
for(i=0; nombre_de_joueurs>i; i++)
{
compteur++;
Affiche_infos(compteur);
}
compteur=0;
return 0;
}
Headers:
#ifndef DEF_MAIN
#define DEF_MAIN
#define TAILLE_MAX_CHAINE 100
typedef struct Personne Personne;
struct Personne
{
char prenom[TAILLE_MAX_CHAINE];
char nom[TAILLE_MAX_CHAINE];
int age;
char ville[TAILLE_MAX_CHAINE];
char adresse[TAILLE_MAX_CHAINE];
};
void Initialiser_structure_Personne(Personne* joueur);
Personne Infos_joueur();
void stocke_infos_joueurs(const Personne joueur_temp);
void Affiche_infos(const int numero_joueur);
Personne Recherche_infos_joueurs(const int numero_joueur);
char* Suprime_retour_a_la_ligne(char chaine_a_modifier[]);
//Initialiser la structure Personne
void Initialiser_structure_Personne(Personne* joueur)
{
(*joueur).age = 0;
}
//definit les infos sur un personnage
Personne Infos_joueur()
{
Personne joueur_temporel;
printf("Votre prenom: ");
scanf("%s", joueur_temporel.prenom);
printf("%s comment? %s ", joueur_temporel.prenom, joueur_temporel.prenom);
scanf("%s", joueur_temporel.nom);
printf("Quel est votre age %s %s? ", joueur_temporel.prenom, joueur_temporel.nom);
scanf("%d", &joueur_temporel.age);
printf("Vous habitez a (ville): ");
scanf("%s", joueur_temporel.ville);
printf("Votre adresse est: ");
scanf("%s", joueur_temporel.adresse);
return joueur_temporel;
}
//Stocke les infos su un joueur
void stocke_infos_joueurs(const Personne joueur_temp)
{
FILE *fichier_infos_joueurs=NULL;
fichier_infos_joueurs=fopen("infos joueurs.txt", "a");
fprintf(fichier_infos_joueurs, "\nPrenom\n%s\nNom\n%s\nAge\n%d\nVille\n%s\nAdresse\n%s\n", joueur_temp.prenom, joueur_temp.nom, joueur_temp.age, joueur_temp.ville, joueur_temp.adresse);
fclose(fichier_infos_joueurs);
}
//affiche les infos sur un joueur
void Affiche_infos(const int numero_joueur)
{
Personne joueur;
joueur=Recherche_infos_joueurs(numero_joueur);
printf("\nFiche d'identite\n=================\nNom: %s\nPrenom: %s\nAge: %d\nVille: %s\nAdresse: %s\n\n", joueur.nom, joueur.prenom, joueur.age, joueur.ville, joueur.adresse);
}
//Rechereche les infos sur un joueur
Personne Recherche_infos_joueurs(const int numero_joueur)
{
FILE *fichier_infos_joueurs=NULL;
Personne joueur;
char chaine_temp[TAILLE_MAX_CHAINE]="",message_numero_joueur[TAILLE_MAX_CHAINE]="";
sprintf(message_numero_joueur,"Joueur %d\n", numero_joueur);
fichier_infos_joueurs=fopen("infos joueurs.txt", "r");
rewind(fichier_infos_joueurs);
while(strcmp(chaine_temp , message_numero_joueur)!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
//Recherche le prenom
while(strcmp(chaine_temp , "Prenom\n")!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
fgets(joueur.prenom, TAILLE_MAX_CHAINE, fichier_infos_joueurs);
joueur.prenom[0]=Suprime_retour_a_la_ligne(joueur.prenom);
//Recherche le Nom
while(strcmp(chaine_temp , "Nom\n")!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
fgets(joueur.nom, TAILLE_MAX_CHAINE,fichier_infos_joueurs);
joueur.nom[0]=Suprime_retour_a_la_ligne(joueur.nom);
//recherche l'age
while(strcmp(chaine_temp , "Age\n")!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
fscanf(fichier_infos_joueurs, "%d", &joueur.age);
//Recherche la ville
while(strcmp(chaine_temp , "Ville\n")!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
fgets(joueur.ville, TAILLE_MAX_CHAINE, fichier_infos_joueurs);
joueur.ville[0]=Suprime_retour_a_la_ligne(joueur.ville);
//Recherche l'adresse
while(strcmp(chaine_temp , "Adresse\n")!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
fgets(joueur.adresse,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
joueur.adresse[0]=Suprime_retour_a_la_ligne(joueur.adresse);
return joueur;
}
char* Suprime_retour_a_la_ligne(char chaine_a_modifier[])
{
char* retour_a_la_ligne=NULL;
retour_a_la_ligne=strrchr(chaine_a_modifier, '\n');
retour_a_la_ligne[0]='\0';
return chaine_a_modifier;
}
#endif
Merci de vos réponses!
p3t3r42
Messages postés
74
Date d'inscription
mardi 18 janvier 2011
Statut
Membre
Dernière intervention
2 février 2014
28
15 avril 2012 à 21:35
15 avril 2012 à 21:35
Dans ce cas là je pense qu'il est plus simple de faire :
void Suprime_retour_a_la_ligne(char chaine_a_modifier[])
{
char* retour_a_la_ligne=NULL;
retour_a_la_ligne=strrchr(chaine_a_modifier, '\n');
retour_a_la_ligne[0]='\0';
}
Là, on ne fait que modifier la chaine envoyée en paramétre à la fonction, on peut donc ensuite faire, par exemple:
//Recherche le Nom
while(strcmp(chaine_temp , "Nom\n")!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
fgets(joueur.nom, TAILLE_MAX_CHAINE,fichier_infos_joueurs);
Suprime_retour_a_la_ligne(joueur.prenom);
Autre petite remarque:
-pour modifier un caractere d'une chaine utilise les crochets, par exemple :
chaine[0] = 'a';
ou
chaine1[0]=chaine2[0];
Mais Attention /!\
chaine1 = chaine2;
ou
chaine1 = Suprime_retour_a_la_ligne(...);
possible que si chaine1 est déclarer ainsi : char *chaine1 = NULL;
Tu copira alors l'adresse en mémoire de la chaine2 (ou de celle retournée par la fonction) dans chaine1
void Suprime_retour_a_la_ligne(char chaine_a_modifier[])
{
char* retour_a_la_ligne=NULL;
retour_a_la_ligne=strrchr(chaine_a_modifier, '\n');
retour_a_la_ligne[0]='\0';
}
Là, on ne fait que modifier la chaine envoyée en paramétre à la fonction, on peut donc ensuite faire, par exemple:
//Recherche le Nom
while(strcmp(chaine_temp , "Nom\n")!=0)
{
fgets(chaine_temp,TAILLE_MAX_CHAINE, fichier_infos_joueurs);
}
fgets(joueur.nom, TAILLE_MAX_CHAINE,fichier_infos_joueurs);
Suprime_retour_a_la_ligne(joueur.prenom);
Autre petite remarque:
-pour modifier un caractere d'une chaine utilise les crochets, par exemple :
chaine[0] = 'a';
ou
chaine1[0]=chaine2[0];
Mais Attention /!\
chaine1 = chaine2;
ou
chaine1 = Suprime_retour_a_la_ligne(...);
possible que si chaine1 est déclarer ainsi : char *chaine1 = NULL;
Tu copira alors l'adresse en mémoire de la chaine2 (ou de celle retournée par la fonction) dans chaine1
15 avril 2012 à 20:43
retour_a_la_ligne=""; // /!\ ERREUR , A NE JAMAIS FAIRE, NE MARCHE PAS EN C =@
tu dois plutôt faire :
retour_a_la_ligne[0] = '\0';
C'est peut être plutôt de là que viens ton problème... ^^
15 avril 2012 à 20:46
15 avril 2012 à 20:50
Merci beaucoup!