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 :

Char et pointeurs vers un char


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Char et pointeurs vers un char
    Salut à tous !


    Pour aller droit au but, j'ai cette structure : char * truc
    Et j'aimerai scanner ce que donne l'utilisateur comme valeur pour ce fameux truc ( donc faire un scanf("%c", &truc) ), sachant que l'utilisateur peut rentré soit un mot, soit une phrase courte, soit un caractère.
    Or si l'utilisateur écrit "Coucou", mon scanf ne prend que la première lettre et ignore le reste... alors que j'utilise un pointeur vers un emplacement mémoire (donc l'endroit où ce qu'à entré l'utilisateur se trouve, si je me trompe pas)

    Vous me direz "autant utiliser : char truc[nb de caract] " si c'est pour récupérer une chaîne ou un caractère seul, mais le truc c'est que je dois minimiser l'espace consommé par mon algo au maximum (et l'optimisation est prise en compte pour ma note ) , d'où le fait que j'aimerai utilisé un pointeur pour pointé vers l'endroit où se trouve ce qu'à rentré l'utilisateur et ainsi récupéré ce qu'il a entré. Ainsi, si il a juste entré un caractère alors je récupère simplement le caractère, sinon je prend tout

    Dans tous les cas, j'ai ce fameux pointeur et j'aimerai qu'il me récupère ce que l'utilisateur écrit tout en optimisant autant que possible la mémoire consommé, mais je bloque (ou peut être est ce ma vision d'un pointeur qui est mauvaise ?)...

    J'avais également songé à tenter de faire scanf("%s", ce_que_donne_l'user) puis de convertir cela en char mais cela n'a pas fonctionner


    Merci d'avance pour toute remarque !
    Dernière modification par LittleWhite ; 02/01/2018 à 07h23. Motif: TItre

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    Par défaut
    Bonjour,

    Un pointeur ça pointe sur une zone de mémoire (allouée dynamiquement ou l'adresse d'une variable). Utiliser un pointeur c'est accéder à cette zone pour par exemple y écrire quelque chose. Par exemple, le scanf ne modifie pas le pointeur, il utilise la zone pointée.
    La fonction scanf("%c",ptr) ne fera que lire 1 caractère pour le copier dans la zone pointée. Pour lire plus de caractères, il est impératif que la zone soit assez grande pour les recevoir, et que le format utilisé dans scanf soit compatible.
    Je dirais donc, il faut impérativement utiliser char truc[nb_de_caract+1], le +1 c'est pour recevoir le caractère de terminaison de chaîne. Et le format du scanf est alors "%s" ou "%[...]".
    Si on connait la taille maximum et quelle n'est pas en milliers d'octets, on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char buffer[NB_CHAR_MAX+1];
    scanf( "%*s" , NB_CHAR_MAX , buffer );  // lira un mot de taille<=NB_CHAR_MAX
    Après, rien n'empêche d'optimiser la taille au moment du stockage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* stockage = malloc( strlen(buffer)+1 );
    strcpy( stockage , buffer );
    Si la taille max est inconnue, la fonction scanf() n'est peut-être pas la plus adaptée. On peut utiliser getchar() pour lire les caractères un après l'autre, allouer dynamiquement les char nécessaires, stocker le résultat dans la zone ré-allouée, jusqu'à détecter la fin de la ligne

  3. #3
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    Un pointeur ça pointe sur une zone de mémoire (allouée dynamiquement ou l'adresse d'une variable). Utiliser un pointeur c'est accéder à cette zone pour par exemple y écrire quelque chose. Par exemple, le scanf ne modifie pas le pointeur, il utilise la zone pointée.
    ....
    Attention à cette phrase, il faut comprendre qu'un pointeur et une variable de type adresse en d’autres termes, c’est une variable comme tant d’autres avec un type, mais sa particularité, c’est qu’il contient uniquement des adresses, on la qualifie de pointeur parce qu’il contient l’adresse de ce qui se trouve en mémoire. Un pointeur est donc une adresse associée à un type de données et ces deux éléments sont absolument indissociables. Si la variable pointeur contient l’adresse d’un objet du type entier par "exemple", l’objet pointé permet donc de savoir comment en dois interpréter les bits qui comptent cet objet, ainsi que ça taille et effectivement utiliser un variable pointeur permet de se rendre à l’adresse mémoire en question.

    Optimiser la mémoire dans le cas présent n’a pas vraiment d'utilité, elle en aura peut-être sur la façon dont vous solliciterez et utiliserez cette mémoire, car il faut savoir que les opérations sur les mémoires sont coûteuses, dans le cas actuel vous utiliserez toujours la mémoire nécessaire pour pouvoir stocker les saisies. Autres points si l’on connaît la taille du buffer qui admettant accepte cinq caractères, il faut en prévoir un de plus en écrivant directement le nombre six puisqu’il vous faut la séquence de fin de chaîne pour que l’on considère véritablement que la chaîne soit une chaîne de caractères et ainsi éviter de faire char buffer[NB_CHAR_MAX+1]; ou buffer = malloc( strlen(buffer)+1 );, car cela sollicite des instructions supplémentaires à effectuer par le processeur. Tout dépend de l'optimisation que fait le compilateur et a ce sujet, il faut lire la documentation du compilateur pour s'en rassurer.

    La seule façon d'utiliser la mémoire de façon "optimale" est d’éviter les opérations trop coûteuses. L’idéal serait d’utiliser la mémoire sollicitée le plus vite possible et la rendre au système (cas de l'allocation dynamique) ou pour une autre tâches. Un simple buffer avec une taille connue est largement suffisant à condition de ne pas nom plus demandé de façon excessive de la mémoire et il n’y a pas besoin d’optimisation que celle du compilateur ou mécanisme interne du système d'exploitation. En revanche, un contrôle de ce que l’on saisit est impératif pour éviter les débordements de mémoire.

    à bientôt

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/04/2017, 13h00
  2. Probléme de pointeur avec des pointeurs de char *
    Par marime dans le forum Débuter
    Réponses: 4
    Dernier message: 30/09/2013, 13h14
  3. [MFC] CString vers const char*
    Par Rafoo dans le forum MFC
    Réponses: 9
    Dernier message: 17/06/2006, 15h43
  4. [C# > C++] Comment convertir un sting^ vers un char* ?
    Par Elbarto dans le forum C++/CLI
    Réponses: 6
    Dernier message: 15/06/2006, 20h58
  5. [MFC - ATL] CString vers const char *
    Par VitamineC dans le forum MFC
    Réponses: 2
    Dernier message: 12/04/2006, 18h56

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