Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/11/2008, à 16:21

tocks

Probleme avec la fonction fgets

Bonjours, je code sous code blocks, en c++.

Je rencontre un probleme avec la fonction fgets, mon problem est que mon 0 n'est pas bien placé a la  fon de mon tableau, je suis obliger de faire cela pour pouvoir l'utiliser.

 fgets(tab,MAX,stdin);

 
   while (tab[i] != 0)
   {

       k =i;

    i++;
   }
    tab[k] = 0;

Quelle est la bonne methode?

Merci d'avance

Hors ligne

#2 Le 14/11/2008, à 18:08

rniamo

Re : Probleme avec la fonction fgets


< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#3 Le 14/11/2008, à 20:25

nicolas.sitbon

Re : Probleme avec la fonction fgets

Que veux tu faire exactement? fgets() garantie le 0 à la fin de la chaine, alors que veux tu faire?

Hors ligne

#4 Le 16/11/2008, à 16:34

tocks

Re : Probleme avec la fonction fgets

ba il me garantie le 0 normalement, mais dans mon programme sa bug avec fgets, je suis obliger de rajouter les lignes que j'ais mit, sinon avec gets sa marche, mais je souhaiterais utiliser fgets.

Voice mon programme:

#include <iostream>

using namespace std;


int verif(char *ptab, double *pconverti);

int main()
{
    const int MAX = 30;
    char tab[MAX];

    double converti;


int k,i = 0;





    printf("Entrez une chaine de caractere :  ");
    fgets(tab,MAX,stdin);
 //   gets(tab);

   while (tab[i] != 0)
   {

       k =i;

    i++;
   }
    tab[k] = 0;


    if( verif(tab, &converti) == 1)


         printf("Vous avez entrer une valeur non autoriser");

    else

         printf("Le chiffre est %lf ",converti);



return 0;
    }




int verif(char *ptab, double *pconverti)
{
   int i = 0;


    while (*(ptab + i) != 0)

    {


            if (((*(ptab + i) >= '0' ) && (*(ptab + i) <= '9'))||(*(ptab + i) == ',')||(*(ptab + i) == '.'))

            {


            i++ ;



            }
            else
            {

                return 1;
            }





    }
i = 0;
    while (*(ptab + i) != 0)
        {

            if (*(ptab + i) == ',')
            {
                    *(ptab + i) = '.';
            }
            i++;




}

  *pconverti = atof(ptab);
return 0;
}

Hors ligne

#5 Le 19/11/2008, à 11:15

philou8237

Re : Probleme avec la fonction fgets

Il bug parce que tu lis MAX caractères (enfin jusqu'à ...) dans une chaine de taille MAX.
hors pour pouvoir placer un '\0' à la fin, il faut un caractère de plus.
Ex: la chaine "foobar" s'écrit "foobar\0", et donc a une taille de 7 caractères et non 6.
Donc soit tu lis MAX - 1, soit ton tableau fait MAX + 1.

De plus: pourquoi utilises tu le C++ ? Ici ton code est entièrement en C. Tu utilise d'ailleurs les fonctions C de la libstream, pas les fonctions C++.

Je serais toi, soit je rédigerais ce programme soit en C (je serais plus de cet avis), soit en C++, mais avec un type String et non char*, avec les fonctions C++ de gestion des flux.

Hors ligne

#6 Le 19/11/2008, à 11:34

nicolas.sitbon

Re : Probleme avec la fonction fgets

philou8237 a écrit :

Il bug parce que tu lis MAX caractères (enfin jusqu'à ...) dans une chaine de taille MAX.
hors pour pouvoir placer un '\0' à la fin, il faut un caractère de plus.
Ex: la chaine "foobar" s'écrit "foobar\0", et donc a une taille de 7 caractères et non 6.
Donc soit tu lis MAX - 1, soit ton tableau fait MAX + 1.

De plus: pourquoi utilises tu le C++ ? Ici ton code est entièrement en C. Tu utilise d'ailleurs les fonctions C de la libstream, pas les fonctions C++.

Je serais toi, soit je rédigerais ce programme soit en C (je serais plus de cet avis), soit en C++, mais avec un type String et non char*, avec les fonctions C++ de gestion des flux.

Non et c'est pour cela que je n'ai pas relevé d'erreur, fgets() ne fait pas de buffer overflow comme tu sembles le penser :

7.19.7.2 The fgets function
  Synopsis
1         #include <stdio.h>
          char *fgets(char * restrict s, int n,
                  FILE * restrict stream);
  Description
2 The fgets function reads at most one less than the number of characters specified by n
  from the stream pointed to by stream into the array pointed to by s. No additional
  characters are read after a new-line character (which is retained) or after end-of-file. A
  null character is written immediately after the last character
read into the array.
  Returns
3 The fgets function returns s if successful. If end-of-file is encountered and no
  characters have been read into the array, the contents of the array remain unchanged and a
  null pointer is returned. If a read error occurs during the operation, the array contents are
  indeterminate and a null pointer is returned.

La seule erreur notable, c'est qu'il n'a toujours pas spécifier son problème clairement ainsi que son "bug".

Hors ligne

#7 Le 19/11/2008, à 11:38

philou8237

Re : Probleme avec la fonction fgets

Oui effectivement, là c'est moi qui ai bugué wink

Hors ligne

#8 Le 19/11/2008, à 12:01

jofab

Re : Probleme avec la fonction fgets

Bonjour
le code :

   fgets(tab,MAX,stdin);
   while (tab[i] != 0)
   {
      k =i;
      i++;
   }
    tab[k] = 0;

ne fait qu' mettre 0 dans une case qui contient deja 0. Cela ne change rien...

Hors ligne

#9 Le 19/11/2008, à 12:03

nicolas.sitbon

Re : Probleme avec la fonction fgets

jofab a écrit :

Bonjour
le code :

   fgets(tab,MAX,stdin);
   while (tab[i] != 0)
   {
      k =i;
      i++;
   }
    tab[k] = 0;

ne fait qu' mettre 0 dans une case qui contient deja 0. Cela ne change rien...

Non il met à 0 l'avant dernier caractère de la chaîne, généralement le '\n' sur un fgets().

Hors ligne

#10 Le 19/11/2008, à 12:09

jofab

Re : Probleme avec la fonction fgets

Excuse, j'ai lu un peu vite... Je pense que c'est le new line. Tu mets à 0 la case qui precede donc c'est certainement le newline. Il est preferable de faire qqc du style :

for(i=0;i<MAX;i++) {
 if (tab[i]=='\n') {
   tab[i]=0;
    break;
}

Dernière modification par jofab (Le 19/11/2008, à 12:10)

Hors ligne

#11 Le 19/11/2008, à 12:10

nicolas.sitbon

Re : Probleme avec la fonction fgets

Comme je l'ai déjà dit, tant que l'on aura pas une définition claire du problème ainsi que du "bug", inutile de parler.

Hors ligne

#12 Le 19/11/2008, à 12:13

jofab

Re : Probleme avec la fonction fgets

verif renvoie 1 qd il rencontre le newline et ne fait pas la conversion... si on remplace le newline par 0, il traite la chaine et fait la convertsion

Hors ligne