Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pointeur sur une chaine

Sujet résolu
    14 avril 2006 à 13:06:47

    Bonjour à tous, je voudrais modifier une chaine par pointeur, cependant mon code ne marche pas, il ne se compile pas :

    #include <iostream.h>

    int main(int argc, char *argv[])
    {

    char nom[] = "aha";
    int *pointeur = NULL;

    pointeur = &nom;

    cout << nom;

    sprintf(*pointeur, "lol");

    cout << nom;


    }


    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      14 avril 2006 à 13:12:11

      Tu peux pas vraiment faire ça.

      Déja ce serait pas int *pointeur; mais char *pointeur;
      Ensuite nom c'est un pointeur, donc &nom ça va pas.

      Enfin, http://www.eskimo.com/~scs/c-faq.com/decl/strlitinit.html
      • Partager sur Facebook
      • Partager sur Twitter
        14 avril 2006 à 13:15:15

        Désolé mais je n'ai pas tout compris :(

        Pourquoi nom est, ou doit être un pointeur ?

        Merci pour le lien, mais je doit dire que le C/C++ en anglais je comprends pas grand chose :S

        Un code pour m'expliquer ?

        Merci pour ton aide ;)
        • Partager sur Facebook
        • Partager sur Twitter
          14 avril 2006 à 14:12:41

          char nom[] = "aha";

          nom, ça représente un tableau, et donc c'est en gros assimilable à un pointeur. Si tu ne le savais pas, va relire le cours sur les tableaux.

          int *pointeur = NULL;

          pointeur est un pointeur vers un entier (ça devrait être un pointeur vers une lettre, soit char *pointeur;, mais bon passons) :
          - quand on écrit 'pointeur' ça désigne l'adresse
          - quand on écrit '*pointeur' ça désigne le nombre qui se trouve à cette adresse

          pointeur = &nom;

          À gauche, pointeur est un pointeur vers un entier.
          À droite. nom est un pointeur (en gros), donc &nom est un pointeur vers un pointeur.
          Tu assignes à un pointeur un pointeur vers un pointeur. Donc c'est faux, et ça plante.

          sprintf(*pointeur, "lol");

          À sprintf on doit fournir un pointeur vers un char. Or là, *pointeur pas un pointeur, puisque c'est un entier, l'entier qui se trouve à l'adresse 'pointeur'.
          • Partager sur Facebook
          • Partager sur Twitter
            14 avril 2006 à 17:51:51

            Donc serait-ce impossible ? :'(
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              14 avril 2006 à 18:19:46

              Normalement je vois pas pourquoi ça poserait problème, ou alors c'est que je dis une grosse connerie :
              #include <iostream.h>

              int main(int argc, char *argv[])
              {
              char nom[] = "aaaaaaaaa";
              char *pointeur = NULL;
              pointeur = nom;

              cout << nom;
              sprintf(pointeur, "bbb");
              cout << nom;
              }

              • Partager sur Facebook
              • Partager sur Twitter
                14 avril 2006 à 18:33:36

                Il est parfois nécessaire de déclarer une chaîne ou un caractère comme int : par exemple dans le cas où le ou l'un des caractrères en question devrait être égal à EOF.

                Arrêtez moi si je me trompe.

                ++ !
                • Partager sur Facebook
                • Partager sur Twitter
                  15 avril 2006 à 0:00:24

                  Le code de louisclem marche très bien ! Merci !

                  PS : Comment ça marche ? o_O
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 avril 2006 à 11:18:10

                    Un tableau est implicitement converti en pointeur sur la première case du tableau. ;)

                    D'où les écritures t[i] qui ne sont en fait qu'une autre manière d'écrire *(t + i).
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 avril 2006 à 11:42:10

                      Citation : mleg

                      Il est parfois nécessaire de déclarer une chaîne ou un caractère comme int : par exemple dans le cas où le ou l'un des caractrères en question devrait être égal à EOF.

                      Arrêtez moi si je me trompe.


                      STOP

                      Un caractère uniquement, avec fgetc(), par exemple, par ce qu'il faut pouvoir détécter la valeur EOF (int < 0), mais une chaine de caractères est toujours un tableau de char.

                      (ou de wchar_t si on utilise les caractères étendus)
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Music only !
                        15 avril 2006 à 11:46:05

                        Merci. :)

                        Mais heu, pourquoi ? :euh:

                        Les chars sont bien des petits entiers non ?

                        Il s'agit peut-être d'une spécification de la norme ?

                        Merci d'avance ;)

                        [e:] Hum trouvé il me semble : les fonctionsde string.h n'acceptent que des char* ^^ (je vous dis pas le nombre de warning que je viens de prendre).

                        Après je me trompe sans doute. [\e]
                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 avril 2006 à 12:14:07

                          Citation : mleg


                          Mais pourquoi ? Les chars sont bien des petits entiers non ?


                          Petits, je ne sais pas, ça dépend de l'implémentation. (Je connais des char de 32 bits...) Entiers, oui.

                          Citation : mleg


                          Il s'agit peut-être d'une spécification de la norme ?


                          La norme dit qu'une chaine est un tableau de caractères terminé par un 0, mais sans préciser le type.

                          Citation : N1124


                          ISO/IEC 9899:TC2 Committee Draft — May 6, 2005 WG14/N1124
                          7. Library
                          7.1 Introduction
                          7.1.1 Definitions of terms
                          1 A string is a contiguous sequence of characters terminated by and including the first null
                          character. The term multibyte string is sometimes used instead to emphasize special
                          processing given to multibyte characters contained in the string or to avoid confusion
                          with a wide string. A pointer to a string is a pointer to its initial (lowest addressed)
                          character. The length of a string is the number of bytes preceding the null character and
                          the value of a string is the sequence of the values of the contained characters, in order.
                          2 The decimal-point character is the character used by functions that convert floating-point
                          numbers to or from character sequences to denote the beginning of the fractional part of
                          such character sequences.154) It is represented in the text and examples by a period, but
                          may be changed by the setlocale function.
                          3 A null wide character is a wide character with code value zero.
                          4 A wide string is a contiguous sequence of wide characters terminated by and including
                          the first null wide character. A pointer to a wide string is a pointer to its initial (lowest
                          addressed) wide character. The length of a wide string is the number of wide characters
                          preceding the null wide character and the value of a wide string is the sequence of code
                          values of the contained wide characters, in order.
                          5 A shift sequence is a contiguous sequence of bytes within a multibyte string that
                          (potentially) causes a change in shift state (see 5.2.1.2). A shift sequence shall not have a
                          corresponding wide character; it is instead taken to be an adjunct to an adjacent multibyte
                          character.155)


                          Il existe des chaines 'normales' (char) et 'larges' (wchar_t). Toutes les fonctions 'string' sont basées sur ce principe...
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Music only !

                          Pointeur sur une chaine

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown