Partage
  • Partager sur Facebook
  • Partager sur Twitter

Modification d'une chaîne de caractères

Passage en majuscules.

Sujet résolu
    18 septembre 2020 à 18:41:27

    Bonjour à tous,

    Je suis toute nouvelle sur le forum, et débutante en langage C, et je n'arrive pas à comprendre ce qui fait planter mon petit programme.

    Je dois passer une chaîne de caractères en majuscules, mais dès que j'essaie de modifier une case de mon tableau de char, j'ai droit à un plantage. Voici ce que j'ai écrit :

    Et donc, c'est avec le passage chaine[i] += 'A' - 'a'; que ça plante.

    Si quelqu'un voit ce que je ne vois pas... :)

    -
    Edité par FlorenceDeb 18 septembre 2020 à 18:58:10

    • Partager sur Facebook
    • Partager sur Twitter
      18 septembre 2020 à 19:06:41

      Salut,
      D'abord, tu auras besoin de l'entête  stdlib.h pour ta fonction system().
      Ensuite ta fonction est de type int mais tu n'as pas besoin du résultat. Mets la de type 'void' et enlèves le return.
      Le vrai problème est que tu essaies de modifier quelque chose qui est un littéral, donc non modifiable.
      ... tu as effacé ton code avant que je réponde.
      Fais quelque chose du genre
      char tableau[]="...";
      toUpper(tableau);
      et la fonction:
      void toUpper(char tableau[])
      Dans la fonction, tu peux mettre la déclaration de 'i' dans le 'for':
          for (int i = 0; chaine[i] != '\0'; i++) {

      -
      Edité par PierrotLeFou 18 septembre 2020 à 19:14:02

      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        18 septembre 2020 à 19:09:55

        Bonjour PierrotLeFou,

        Merci pour ta réponse. J'avais mis une capture d'écran de mon code pour remplacer mon copier-coller qui faisait disparaître l'indentation...J'espère que cette capture est visible.

        Il y a donc une différence fondamentale entre la déclaration d'un pointeur sur char et la déclaration d'un tableau de char au niveau des modifications possibles si je comprends bien ?

        Je vais essayer ce que tu me dis, et je reviens donner des nouvelles. Merci d'avoir pris le temps :)

        ...Eh bien, c'était ça. Quelle efficacité !

        Merci beaucoup, parce que je commençais à devenir folle. J'étais pourtant persuadée que notre enseignante nous avait parlé d'une équivalence entre les notations sous forme de pointeur avec * et celles sous forme de tableau avec [].

        -
        Edité par FlorenceDeb 18 septembre 2020 à 19:13:29

        • Partager sur Facebook
        • Partager sur Twitter
          18 septembre 2020 à 19:16:37

          Tu es plus rapide que moi. :)
          J'ai fait ma modif après ton post ...
          Il vaut mieux utiliser le bouton <code> plutôt qu'une capture d'écran.
          Je suis aveugle et je ne peux pas voir les captures d'écran. J'ai pu lire ta version originale.

          -
          Edité par PierrotLeFou 18 septembre 2020 à 19:20:44

          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            18 septembre 2020 à 19:22:24

            A propos de la déclaration dans le for, nous travaillons en C90...Est-ce valable aussi avec cette ancienne norme ?

            J'ai très peu programmé jusqu'ici et je sais qu'en Java on le faisait (avec le problème de persistance de la variable au-delà de la boucle que ça posait) mais il me semblait que le C90 ne l'acceptait pas...

            Enfin, ça tourne, c'est le principal ! :honte:

            PS : bien reçu pour l'usage du bouton code. J'y veillerai à l'avenir !

            -
            Edité par FlorenceDeb 18 septembre 2020 à 19:24:17

            • Partager sur Facebook
            • Partager sur Twitter
              18 septembre 2020 à 19:28:34

              Le C 90? Ça fait un million d'années que je ne l'ai pas utilisé ...
              Il serait souhaitable si c'est possible d'avoir un compilateur plus récent avec la norme C99.
              Travailles-tu avec l'ordi de ton prof ou si C a été installé sur ton ordi?
              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

                18 septembre 2020 à 19:34:16

                J'ai installé aujourd'hui même la version communautaire gratuite de Visual Studio (2019) sur mon PC, étant donné que c'est l'IDE qu'on nous fait utiliser en cours...mais en version 2017, et éventuellement pas la communautaire.

                Je tiens à préciser que ce choix du C90 en est vraiment un de la part de l'enseignante, car le cours explique que tous les compilateurs ne respectent pas les normes C99 et C11. Etant donné que c'est un module de mise à niveau en algorithmique avant de se lancer dans le langage Java à corps perdu, il n'a sûrement pas été estimé nécessaire de faire quelque chose d'applicable en milieu professionnel...

                -
                Edité par FlorenceDeb 18 septembre 2020 à 19:38:52

                • Partager sur Facebook
                • Partager sur Twitter
                  18 septembre 2020 à 19:53:35

                  C'est douteux comme décision. Pourquoi apprendre un langage si on l'apprend mal.
                  Les nouveaux compilateurs respectent beaucoup mieux les normes que les anciens.
                  Sur ce site, tu trouveras les nouvelles normes pour le langage C:
                  https://zestedesavoir.com/tutoriels/755/le-langage-c-1/1042_les-bases-du-langage-c/4275_introduction-a-la-programmation/
                  Ce site contient un très bon cours sur le langage C.
                  -
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    18 septembre 2020 à 19:59:11

                    Je te remercie pour tout PierrotLeFou. Tu as vraisemblablement sauvé ma soirée, et peut-être même mon évaluation de mardi dans la foulée. Je vais aller voir tout ça...

                    Bonne soirée, et bon week-end. 

                    -
                    Edité par FlorenceDeb 18 septembre 2020 à 19:59:35

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 septembre 2020 à 20:11:47

                      FlorenceDeb a écrit:

                      Merci beaucoup, parce que je commençais à devenir folle. J'étais pourtant persuadée que notre enseignante nous avait parlé d'une équivalence entre les notations sous forme de pointeur avec * et celles sous forme de tableau avec [].

                      Ce n'est pas ça le problème. Il y a des équivalences d'écriture entre pointeur et tableau, mais néanmoins un pointeur et un tableau sont deux choses différentes.

                      char* mot = "Coucou" ;

                      Ici, 'mot' est un pointeur. Ce n'est pas un tableau (donc pas une chaîne de caractères). Certes, on peut utiliser la notation mot[i], mais encore faut-il savoir à quoi elle permet d'accéder. Ici, justement, mot[i] permet d'accéder à la chaîne littérale "Coucou", qui n'est pas une variable du programme, et donc on ne peut pas la modifier. Mais avec cette notation, on pourrait tout à fait modifier une variable de type chaîne. Exemple :

                      char motdepasse[] = "Coucou" ;
                      char* mot = motdepasse ;

                      Cette fois 'mot' pointe sur une variable, le tableau 'motdepasse'. La notation mot[i] permet d'accéder aux caractères de ce mot, mais aussi de les modifier.

                      Quant à 'motdepasse', on peut le modifier puisque c'est une variable : c'est une chaîne de caractères. (Ce n'est pas un pointeur !)

                      -
                      Edité par robun 18 septembre 2020 à 20:14:40

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 septembre 2020 à 21:19:48

                        Bonsoir robun,

                        Merci pour ta réponse. Je dois dire que le stockage des données et l'accès à ces données sont des notions encore assez embrouillées dans ma tête.

                        Je pense comprendre que ça n'est pas parce qu'on pointe sur "Coucou", qu'on a un tableau de caractères à disposition. J'ai entendu vaguement parler de "pool des littéraux", et je crois me souvenir que si je déclarais en Java une String chaine1 = "allo" et une String chaine2 = "allo", ça pointait au même endroit...Je ne sais pas si c'est le même principe ?

                        Bon, je pense que je vais essayer de mettre ça bien à plat, grâce à ton éclairage.

                        Par contre, j'ai bien compris que dans ton second exemple, une fois le tableau déclaré on pouvait se promener via un pointeur et modifier les valeurs du tableau.

                        -
                        Edité par FlorenceDeb 18 septembre 2020 à 21:20:32

                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 septembre 2020 à 22:41:02

                          FlorenceDeb a écrit:

                          et je crois me souvenir que si je déclarais en Java une String chaine1 = "allo" et une String chaine2 = "allo", ça pointait au même endroit...Je ne sais pas si c'est le même principe ?

                          D'après mes souvenirs, en langage C c'est possible mais pas obligatoire : avec certaines implémentations du langage la chaîne littérale peut être regroupée, avec d'autres elle existera en deux exemplaires. Mais peu importe, ce qui compte est que cette chaîne n'est pas stockée dans une variable et ne nous « appartient » pas, on peut juste la consulter.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 septembre 2020 à 7:18:27

                            Merci pour cette explication, c'est très clair ; je suis contente de comprendre ce qui a fait que le programme ne s'exécutait pas comme je le pensais.

                            Voilà une erreur que je ne ferai plus !

                            Je ne pense pas pouvoir aider qui que ce soit sur le forum avant un long moment, mais quand je serai en mesure de le faire, je n'hésiterai pas à donner un coup de main en retour. :)

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Modification d'une chaîne de caractères

                            × 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