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 :

Quelques questions sur les chaines de caractères.


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Points : 109
    Points
    109
    Par défaut Quelques questions sur les chaines de caractères.
    Bonjour, j ai plusieurs questions concernant les chaines de caractères...

    1) Je viens de parcourir ce tuto et je me suis rendu compte que, par exemple, la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(char * out, const char * in)
    ne s'occupe pas d'allouer la memoire nécessaire à la copie.
    Si bien qu en fait je dois plutot ecrire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    out = malloc(sizeof(char) * (strlen(in)+1)); strcpy(out,in);/* blabla */; free(out);
    J'imagine que c'est pour qu'on n'oublie pas au passage de liberer out.
    Du coup je me pose une question sur strcat(char * Res, const char * toAppend)...
    Est ce que pour concatener deux chaines de caracteres je dois en fait faire quelquechose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char* Res2=malloc(sizeof(char) * (strlen(Res)+strlen(toAppend)+1);
    strcpy(Res2,Res);
    free(Res); /* Je suppose que Res a été alloué... */
    strcat(Res2,toAppend);
    Res = Res2;
    Il doit y avoir un truc qui m’échappe parce que ça me parait pour le moins lourdingue...

    2) Je ne la vois pas dans le tuto mentionné plus haut mais existe-t-il une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* commeprintf(const char* S,...)
    qui pour un appel du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    commeprintf("Salut %s","Toto");
    me renverrait la chaine "Salut Toto" ?
    Ou bien sur toute autre fonction au comportement analogue... dans string.h ou pas d'ailleurs.

    Merci !

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    1) Si tu veux avoir le tableau final en allocation dynamique

    2) voir la fonction standard sprintf() (<stdio.h>) qui fonctionne comme fprintf() mais en mettant le résultat dans un tableau (et qui peut apporter parfois des alternatives aux questions (1))
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Points : 109
    Points
    109
    Par défaut
    Merci !

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BaygonV Voir le message
    Bonjour, j ai plusieurs questions concernant les chaines de caractères...

    1) Je viens de parcourir ce tuto et je me suis rendu compte que, par exemple, la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(char * out, const char * in)
    ne s'occupe pas d'allouer la memoire nécessaire à la copie.
    Si bien qu en fait je dois plutot ecrire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    out = malloc(sizeof(char) * (strlen(in)+1)); strcpy(out,in);/* blabla */; free(out);
    J'imagine que c'est pour qu'on n'oublie pas au passage de liberer out.
    Salut
    C'est surtout pour être tout à fait indépendant du contexte. La copie peut très bien se faire sur une chaine allouée avant, ou bien sur un tableau de caractères. Donc strcpy() ne peut pas faire un malloc systématique sinon ça ne fonctionnerait pas pour un tableau statique.
    Evidemment en retour tu dois garantir à strcpy() que la zone cible a assez d'espace pour recevoir la source et le '\0'.
    N'oublie pas non plus que le C est extrêmement minimaliste. C'est à toi de tout faire car il ne fait rien pour toi. Et en retour tu as un des langages les plus rapides qui soient...

    Ceci dit, tu as la fonction strdup() qui a été rajoutée un peu plus tard et qui est un condensé malloc() + strcpy()...

    Citation Envoyé par BaygonV Voir le message
    Du coup je me pose une question sur strcat(char * Res, const char * toAppend)...
    Est ce que pour concatener deux chaines de caracteres je dois en fait faire quelquechose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char* Res2=malloc(sizeof(char) * (strlen(Res)+strlen(toAppend)+1);
    strcpy(Res2,Res);
    free(Res); /* Je suppose que Res a été alloué... */
    strcat(Res2,toAppend);
    Res = Res2;
    Il doit y avoir un truc qui m’échappe parce que ça me parait pour le moins lourdingue...
    Ouais assez. Si res a été alloué alors tu as
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Res=realloc(Res, sizeof(char) * (strlen(Res)+strlen(toAppend)+1);
    strcat(Res,toAppend);
    Le C est minimaliste mais il y a quand-même tous les outils de base...
    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]

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Points : 109
    Points
    109
    Par défaut
    Ah et bien merci pour ces éclaircissements !
    J ai (il y a longtemps) fait un peu de C++, je ne pensais pas qu il serait si penible de se mettre au C par la suite
    Y a t il d'autres fonctions du type malloc, realloc... que je devrais connaitre pour me defaire de mon bon vieux new ?

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BaygonV Voir le message
    Y a t il d'autres fonctions du type malloc, realloc... que je devrais connaitre pour me defaire de mon bon vieux new ?
    Hum... c'est plutôt new qui a été inventé pour se défaire du malloc/realloc.
    Non, il n'y en a pas d'autre. T'as malloc() qui alloue, realloc() qui réalloue (et qui peut aussi se comporter comme malloc() si la zone à réallouer est nulle), de quoi d'autre pourrait-on avoir besoin ? Peut-être éventuellement d'une allocation avec MAZ de la zone alloué => calloc()...
    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]

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Points : 109
    Points
    109
    Par défaut
    Salut, oui oui j ai bien compris que c est new qui est venu après malloc mais de mon point de vu ca se fait a l envers puisque j ai fait du c++ sans faire de c avant.
    Merci en tout cas, je poste une autre question dans un autre fil puisque j ai indiqué que celui ci était résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. question sur les chaines de caractères
    Par yacin87 dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 11/04/2010, 22h19
  2. question sur les chaines de caractère
    Par yacin87 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 10/04/2010, 08h59
  3. question sur les chaine de caractères
    Par amy0o0 dans le forum C
    Réponses: 11
    Dernier message: 14/10/2006, 14h14
  4. question sur les chaines de caractères
    Par pierrOPSG dans le forum C
    Réponses: 5
    Dernier message: 13/04/2006, 18h55
  5. xsl : test sur les chaine de caractère
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 13/07/2005, 15h43

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