IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

pointeur chaine de caracteres


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2011
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 56
    Points : 34
    Points
    34
    Par défaut pointeur chaine de caracteres
    bonjour,

    je fais quelque chose de pas correct mais je n arrive pas a trouver

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void trim(char *str) {}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      char titreSaisie[51];
      gets(titreSaisie);
      char *titre=strdup(titreSaisie);
      trim(*titre);
      printf("%s\n", titre);
    merci pour votre aide

  2. #2
    Nouveau membre du Club
    Inscrit en
    Septembre 2011
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    je pense que c est l erreur
    trim(titre);

    Il y a t il possibilité de faire plus compact comme code sans changer le prototype du trim ?

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Au passage, il ne faut pas utiliser gets mais fgets https://gradot.wordpress.com/2013/05...-programmes-c/

  4. #4
    Nouveau membre du Club
    Inscrit en
    Septembre 2011
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    Merci pour la remarque pour fgets, je vais en tenir compte.
    Il y a t il moyen de simplifier mon code ci dessus ? je le trouve inutilement compliqué ?
    De plus je voudrais que ma chaine de caractère soit coupée si elle dépasse 50 caracteres de saisie.
    Merci

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par lefevrelaumonier Voir le message
    je pense que c est l erreur
    trim(titre);
    Bien évidemment !!! Ta fonction "trim()" attend un "char étoile". Or tu as défini "titre comme étant un "char étoile". Donc en lui passant "titre", tu lui passes un élément du bon type. Alors qu'en lui passant "étoile titre" dans ta version précédente, tu lui passes un "char". Et un "char" n'est pas un "char étoile".

    Citation Envoyé par lefevrelaumonier Voir le message
    Il y a t il possibilité de faire plus compact comme code sans changer le prototype du trim ?
    Je pense que trim(fgets(titreSaisie, 51, stdin)); printf(titreSaisie); est ce qu'il y a de plus compact. Et si on accepte de changer le prototype de trim() pour lui faire renvoyer le pointeur de début de chaine, alors on peut faire directement printf(trim(fgets(titreSaisie, 51, stdin)));.
    Mais hormis des cas extrêmes, la compacité d'un code n'influe absolument pas sur sa rapidité (et influe en revanche fortement et de façon inversement proportionnelle sur sa lisibilité).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Cela n'influe souvent pas de manière positive sur la vitesse d'exécution mais il est aussi possible que cela ne doone pas un programme plus petit en mémoire. En effet, un code compact est souvent un code peu simple et qui nuit au travail du compilateur.....sur la taille et la vitesse.

  7. #7
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Pour limiter le nombre de caractères à la taille du buffer, il faut s'arrêter à la taille et penser à vider les caractères de trop.
    On peut, par exemple, écrire la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    char* lireAvecLimitation( char* chaine , int tailleBuffer )
    {
        chaine = fgets( chaine , tailleBuffer , stdin );
        char* p = strchr( chaine , '\n' ); // une chaine complete a recu le CR
     
        if ( p != NULL ) {     // la chaine est complete, oter le CR de fin
            *p = 0;  
        }
        else {        // il y a eu depassement, vider le buffer de reception
            int  c;
     
            while ( (c = getchar()) != '\n'  &&  c != EOF ) {
            }          // purge des caracteres jusqu'au CR inclus
        }
        return chaine;
    }

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dalfab Voir le message
    et penser à vider les caractères de trop.
    Je suis pas certain que ce soit toujours une bonne chose...

    Prenons par exemple ce petit code, clone minimaliste de la commande "cat" d'Unix (ou de la commande "type" de Windows) à laquelle j'ai rajouté la suppression du reste de stdin telle que tu la montres
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <stdio.h> 
    #include <string.h>
     
    char *saisie(char *buf, int taille)
    {
    	char *ret=fgets(buf, taille, stdin);
    	return ret;
     
    	// Bloc de suppression de stdin (inhibé avec le return précédent)
    	if (strchr(buf, '\n') == NULL) 
    	{
    		int c;
    		while ((c=getchar()) != '\n' && c != EOF);
    	}
    	return ret;
    }
     
    int main()
    {
    	char tampon[10];
     
    	while (saisie(tampon, 10))
    		fputs(tampon, stdout);
    }

    Si je compile ce code sous le nom "mycat", je peux alors taper un truc du style cat /etc/passwd |./mycat ou piper tout autre flux quelconque (who, last, ls -l, etc). Ce qui en sort sera identique à ce qui y est entré

    Mais si je supprime de la fonction ce premier return et que je laisse le bloc de suppression s'exécuter, ce qui sort du programme est alors un flux où chaque ligne est tronquée à 9 caractères.

    Il ne faut pas prendre systématiquement l'habitude de purger stdin car parfois ce qui y est resté a encore de l'importance...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. tableau de chaine de caractere avec pointeur
    Par Oussama1 dans le forum C++
    Réponses: 7
    Dernier message: 15/12/2008, 13h12
  2. Réponses: 7
    Dernier message: 06/11/2007, 09h15
  3. pointeurs et chaines de caracteres
    Par lylia SI dans le forum Débuter
    Réponses: 2
    Dernier message: 19/08/2007, 19h00
  4. Réponses: 2
    Dernier message: 12/10/2006, 20h28
  5. Réponses: 3
    Dernier message: 19/12/2004, 14h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo