Pages : 1
#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
http://www.cplusplus.com/reference/clib … /gets.html
normalement t'as bon.
< 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
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é
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
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