Prgm qui supprime le \n d'une chaine (en C)

Résolu
Thom@s -  
p3t3r42 Messages postés 89 Statut Membre -
Bonsoir à tout le monde,
Je viens de commencer à apprendre à programmer en C avec Code::Blocks sous Windows 7. J'ai essayé de faire le programme suivant, qui doit normalement supprimer le dernier retour a la ligne d'une chaine, mais il ne marche pas:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAILLE_MAX 100

char* Suprime_retour_a_la_ligne(char chaine_avec_retour[]);

int main(int argc, char *argv[])
{
char chaine_avec_retour_a_la_ligne[TAILLE_MAX]="Il y a un retour a la ligne:\n", chaine_sans_retour_a_la_ligne[TAILLE_MAX];
chaine_sans_retour_a_la_ligne=Suprime_retour_a_la_ligne(chaine_avec_retour_a_la_ligne);
printf("%s%s...", chaine_avec_retour_a_la_ligne, chaine_sans_retour_a_la_ligne);
}

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="";
return chaine_a_modifier;
}

Si quelqu'un aurait une solution, je le remercie d'avance.

4 réponses

  1. p3t3r42 Messages postés 89 Statut Membre 28
     
    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 ;)
    0
    1. p3t3r42 Messages postés 89 Statut Membre 28
       
      Oups, j'ai zappé ce détails :
      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... ^^
      0
    2. Thom@s
       
      Comment dois-je faire alors pour supprimer le \n?
      0
    3. Thom@s
       
      C bon ça marche (il y avait pas ton dernier message lorsque j'ai posé ma question)
      Merci beaucoup!
      0
  2. p3t3r42 Messages postés 89 Statut Membre 28
     
    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
    }
    0
  3. Thom@s
     
    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!
    0
  4. p3t3r42 Messages postés 89 Statut Membre 28
     
    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
    0