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 :

Problème de taille de tableau


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 31
    Points : 29
    Points
    29
    Par défaut Problème de taille de tableau
    Bonjour, j'ai un problème dans le traitement de chaine de caractères.

    A l'aide de printf j'affiche les caractères contenus dans le tableau mais j'ai des valeurs incohérentes à la fin, et surtout la boucle continue après la fin de la chaine et je comprends pas pourquoi.

    Quelqu'un peut-il m'éclairer ?

    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
     
    int main(int argc, char *argv[]){
     
        int i=0, j=0;
        char tab[100];
        char tab_ss[100];
     
        printf("Entrez le mot ou la phrase a tester suivi de 0 :\n");
        fgets(tab, sizeof tab, stdin);
     
    /* Copie les caractères de tab dans tab_ss sans espaces */
        while(tab[i] != '0'){
    	if(tab[i] != ' '){
    	    tab_ss[j]=tab[i];
    	    ++j;
    	}
    	++i;
        }
     
    /* Affiche la chaine de caracteres sans espaces */
        i=0;
        while(tab[i] != '0'){ printf("%c", tab[i]); ++i; }
     
        printf("\n");
     
        return 0;
    }

  2. #2
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* Affiche la chaine de caracteres sans espaces */
    i=0;
    while(tab[i] != '0'){ printf("%c", tab[i]); ++i; }
    Ce n'est pas plutôt tab_ss que tu dois afficher (et non tab)?
    En tout cas, lors de la copie caractère par caractère, tu n'ajoutes pas le \0 d'où une boucle infinie.
    Solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* Copie les caractères de tab dans tab_ss sans espaces */
    while(tab[i] != '0'){
    if(tab[i] != ' '){
    tab_ss[j]=tab[i];
    ++j;
    }
    ++i;
    } 
    tab_ss[j]='\0' ; // terminer la nouvelle chaine
    Nas'

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    salut, c'est vrai que le code juste au-dessus est plus logique.

    une simple question rhétorique:
    est-ce qu'on ne peut pas lire la chaîne avec une fonction scanf, qui saute les espaces (et tab, etc) et découpe en multiples chaînes (par exemple un tableau de chaînes lues par scanf dans une boucle while ..) , et ensuite concaténer ?
    à priori c'est faisable, même si ça oblige à donner une taille au tableau, donc à courir le risque d'un tableau trop grand ou pire trop petit, et si se pose le problème de l'argument du while (\n ?).

    bon, la première solution est la seule logique, mais c'est simplement pour se torturer les méninges.

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    scanf est complètement déconseillé car très difficile d'utilisation.
    Pour la saisie au claer, utilise fgets(buf, sizeof(buf), stdin).
    Sujet longuement discuté sur ce forum.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Problème de taille de tableau
    Citation Envoyé par k-nine
    Bonjour, j'ai un problème dans le traitement de chaine de caractères.

    A l'aide de printf j'affiche les caractères contenus dans le tableau mais j'ai des valeurs incohérentes à la fin, et surtout la boucle continue après la fin de la chaine et je comprends pas pourquoi.
    Sans doute une chaine mal formée (absence de 0 final).
    Quelqu'un peut-il m'éclairer ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    main.c: In function `main_':
     
    main.c:7: error: implicit declaration of function `printf'
     
    main.c:7: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    main.c:8: error: implicit declaration of function `fgets'
    main.c:8: warning: nested extern declaration of `fgets'
    main.c:8: error: `stdin' undeclared (first use in this function)
    main.c:8: error: (Each undeclared identifier is reported only once
     
    main.c:8: error: for each function it appears in.)
    Et si tu postais la version compilable ?

    J'ai comme l'impression que tu confonds '0' et 0. fgets() mets un 0 automatiquement à la fin de la chaine saisie. Il n'y a pas à saisir de 0 supplémentaire. Par contre, si tu fais une copie en éliminant les espaces redondants, il faut penser à terminer la chaine par un 0 (et non un '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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #include <stdio.h>
     
    int main (int argc, char *argv[])
    {
     
       int i = 0, j = 0;
       char tab[100];
       char tab_ss[sizeof tab];
     
       printf ("Entrez le mot ou la phrase a tester :\n");
       fgets (tab, sizeof tab, stdin);
     
    /* Copie les caractères de tab dans tab_ss sans espaces */
       while (tab[i] != 0)
       {
          if (tab[i] != ' ')
          {
             tab_ss[j] = tab[i];
             ++j;
          }
          ++i;
       }
       tab_ss[j] = 0;
     
    /* Affiche la chaine de caracteres sans espaces */
       i = 0;
       putchar ('\'');
       while (tab_ss[i] != 0)
       {
          putchar (tab_ss[i]);
          ++i;
       }
     
       printf ("'\n");
     
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    merci pour vos réponses !
    je ne comprends pas bien cette instruction par contre : putchar ('\'');

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par k-nine
    je ne comprends pas bien cette instruction par contre : putchar ('\'');
    Ce n'est pas une instruction mais un appel de fonction. La fonction est putchar(). Elle permet d'envoyer un caractère vers stdout. Elle est équivallente à
    Le caractère que je veux émettre est ' (simple quote) ce qui, en langage 'caractères' se dit \', parce que ' est précisément le délimiteur de caractères. Pour émettre un a, je fais:
    pour émettre un ', je fais donc
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. [Debutant][C] Problème de taille de tableau
    Par althora dans le forum Linux
    Réponses: 2
    Dernier message: 15/12/2008, 22h13
  2. Problème de taille de tableau sous IE 7
    Par chatlumo dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 01/08/2008, 15h22
  3. Problème avec taille de tableau et checkbox
    Par narcis60floyjo dans le forum Langage
    Réponses: 5
    Dernier message: 31/03/2008, 16h13
  4. problème de taille de tableau
    Par tromaltsec dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 13/12/2007, 09h29
  5. Problème de taille de tableau
    Par Beush dans le forum C
    Réponses: 4
    Dernier message: 01/11/2005, 17h41

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