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 :

Aide pour chaine en majuscule [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Par défaut Aide pour chaine en majuscule
    Bonjour, je dois écrire une fonction qui met une chaîne de caractère passée en argument en majuscule.
    J'ai donc fait un calcul par rapport à la valeur ascii. Comme a -> 97 et A ->65, alors je fais - 32 à chaque fois. Mais ça ne fonctione pas.

    voici 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
     
    char    *upcase(char *str)
    {
      int   i;
      char  *tp;
     
      i = 0;
      while (str[i] != '\0')
        {
          tp[i] = str[i] - 32;
          i++;
        }
        return (tp);
    }
    et le main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int     main()
    {
      char  *p;
      char  *a;
     
      a = "hello";
      p = upcase(p);
      printf(p);
    }
    erreur : segmentation fault

    Je ne vois pas trop où est le problème

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 15
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char  *tp;
    <...>
    tp[i] = str[i] - 32;
    Tu n'a pas alloué tp, donc tu écris n'importe ou dans la mémoire.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Par défaut
    Selon l'exercice que je dois faire, j'ai pas le droit d'utiliser malloc. En plus l'erreur vien du main, pas de la fonction.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 15
    Par défaut
    Citation Envoyé par jayfaze Voir le message
    Selon l'exercice que je dois faire, j'ai pas le droit d'utiliser malloc. En plus l'erreur vien du main, pas de la fonction.
    J'ai pas dis que tu devais utiliser malloc moi... j'ai dis que utilisais une chaine non allouée et que tu allais écrire n'importe ou dans la mémoire.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Par défaut
    ok !
    J'ai fait tp = "";
    du coup j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    main.c:9: warning: assignment makes integer from pointer without a cast
    comme erreur !

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 15
    Par défaut
    J'ai des questions pour toi...
    As tu besoin d'utiliser tp dans uppercase ?
    Si tu passe ta chaine en pointeur c'est bien pour pouvoir la modifier non ?

    Autre chose, ton code ne marche que si tu passe une chaine de caractère en minuscule et dans aucun autre cas.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Par défaut
    Citation Envoyé par jayfaze Voir le message
    Bonjour, je dois écrire une fonction qui met une chaîne de caractère passée en argument en majuscule.
    J'ai donc fait un calcul par rapport à la valeur ascii. Comme a -> 97 et A ->65, alors je fais - 32 à chaque fois. Mais ça ne fonctione pas.

    voici 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
     
    char    *upcase(char *str)
    {
      int   i;
      char  *tp;
     
      i = 0;
      while (str[i] != '\0')
        {
          tp[i] = str[i] - 32;
          i++;
        }
        return (tp);
    }
    et le main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int     main()
    {
      char  *p;
      char  *a;
     
      a = "hello";
      p = upcase(p);
      printf(p);
    }
    erreur : segmentation fault

    Je ne vois pas trop où est le problème
    Bonjour,

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #include <stdio.h>
    /* upcase1.c */
     
    void upcaset(char str[])
    {
    	int i;
    	i = 0;
    	while (str[i] != '\0')
    	{
    		str[i] = str[i] - 32;
    		i++;
    	}
    }
     
    int main(void)
    {
     
    	int i; 
    	char tab[] = "hello";
    	upcaset(tab);
    	for (i = 0; i < 5; i++)
    		printf("%c", tab[i]);
    	printf("\n");
    	return 0;
    }
    cela fonctionne mais j'ai dû modifier ton code car tu écrits des chose s étranges ? (on doit pouvoir faire mieux, suis pas un expert ;-))

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 15
    Par défaut
    Citation Envoyé par jayfaze Voir le message
    et le main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <...>
    char  *a;
    <...>
      a = "hello";
    <...>
    Bon, le problème vien de cette ligne

    En faisant comme ca, tu définis une chaine de caractère "hello" et tu affecte le pointeur à a.
    Or, cette chaine est constante, c'est a dire que tu n'a pas le droit de la modifier.

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Moi, je ferais comme cela, avec une gestion d'erreur sommaire:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    int upcase(char *dest, char const *src, size_t dest_size);
     
    int main(void)
    {
        /* -tc- La chaine a copier*/
        char const *s = "Bonjour, developpez.net!";
        /* -tc- tampon pour accueillir la copie */
        char s_up[20] = "";
        int err = 0;
     
        err = upcase(s_up, s, sizeof s_up);
     
        /* -tc- eventuellement verifier le code d'erreur retourne */
        printf("original string: %s\nprocessed string: %s\nerr: %d\n", 
                s, s_up, err);
     
        return EXIT_SUCCESS;
    }
     
    int upcase(char *dest, char const *src, size_t dest_size)
    {
        int err = 0;
     
        if (dest != NULL && src != NULL)
        {
            if (dest_size > 1)
            {
                size_t i;
     
                for (i = 0; i < dest_size - 1 && src[i] != 0; i++)
                {
                    dest[i] = toupper((unsigned char) src[i]);
                }
                dest[i] = '\0';
     
                if (src[i] != '\0')
                {
                    /* -tc- Avertissement: la chaine a ete tronquee */
                    err = 3;
                }
            }
            else
            {
                /* -tc- Erreur: la taille du tampon de destination doit etre 
                   superieue a 1 */
                err = 2;
            }
        }
        else
        {
            /* -tc- Erreur: argument invalide */
            err = 1;
        }
     
        return err;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  10. #10
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Par défaut
    rutabagas, la modification par ton code ne met aucune erreur, mais n'affiche rien. Il ne faut pas faire un truc du genre
    ?

    Bruno Gillet, merci pour tes explications. Donc la seule façon de la modifier c'est de passer par un 2nd pointeur ? (d'où mon utilisation de *tp)

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Si cela ne te gène pas de modifier ta chaine en place, tu peux procéder comme cela:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    char * upcase(char *s)
    {
        if (s != NULL)
        {
            size_t i = 0;
     
            while (s[i] != 0)
            {
                s[i] = toupper((unsigned char) s[i]);
                i++;
            }
        }
     
        return s;
    }
     
    int main(void)
    {
        char chaine[] = "Bonjour, developpez!";
     
        printf("%s\n", upcase(chaine));
     
        return EXIT_SUCCESS;
    }
    La solution qui utilise un tampon pour la copie est dans mon ancien post précédent. Les deux fonctions sont portables.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Par défaut
    [QUOTE=jayfaze;2571123]rutabagas, la modification par ton code ne met aucune erreur, mais n'affiche rien. Il ne faut pas faire un truc du genre
    Pour moi cela fonctionne, mais mon OS est linux Debian Sid et j'utilise gcc-4.2,
    mon code n'est pas portable(à windows ;-)) tu dois l'arranger pour ton OS ...
    De plus comme le signale Bruno il faut tenir compte du cas où le mot comporte des majuscules ...
    Le code de Thierry mérite plus d'attention que le mien.

    Bon courage.

  13. #13
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Par défaut
    Ok merci pour vos explications !
    J'ai compris !

    alors ça donne ça

    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
     
    int     main()
    {
      int   i;
     
      i = 0;
      char tab[] = "HeLLoLppmmMM";
      strupcase(tab);
      while (i <= my_strlen(tab))
        {
          my_putchar(tab[i]);
          i++;
        }
      return (0);
    }
    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
    17
    18
    19
    20
     
    char    *strupcase(char str[])
    {
      int   i;
     
      i = 0;
      while (str[i] != '\0')
        {
          if (str[i] >= 97 &&  str[i] <= 122)
            {
              str[i] = str[i] - 32;
              i++;
            }
          else
            {
              i++;
            }
        }
      return (str);
    }
    Et la ça fonctionne. Je suis sous FreeBSD

  14. #14
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par jayfaze Voir le message
    alors ça donne ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char    *strupcase(char str[])
    {
    Les noms commençant par str, suivis d'une minuscule sont réservés pour les évolutions futures du langage. str_upcase() est correct.

    http://emmanuel-delahaye.developpez....htm#id_reserve

    Attention, le code posté est incomplet :
    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
    17
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:2: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:7: warning: implicit declaration of function `strupcase'
    main.c:8: warning: implicit declaration of function `my_strlen'
    main.c:10: warning: implicit declaration of function `my_putchar'
    main.c: At top level:
    main.c:17: error: conflicting types for 'strupcase'
    main.c:7: error: previous implicit declaration of 'strupcase' was here
    Process terminated with status 1 (0 minutes, 4 seconds)
    2 errors, 4 warnings

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

Discussions similaires

  1. aide pour chaine en Majuscule
    Par elgeek dans le forum Débuter
    Réponses: 15
    Dernier message: 29/10/2010, 11h40
  2. Réponses: 5
    Dernier message: 01/07/2008, 16h36
  3. aide pour structure et liste chainée
    Par monsieur77 dans le forum C
    Réponses: 8
    Dernier message: 20/11/2007, 17h25
  4. Réponses: 8
    Dernier message: 23/08/2006, 18h40
  5. Réponses: 15
    Dernier message: 26/03/2006, 12h10

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