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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int cget_line( char * s, const char * msg, const size_t nb ) ;
int string_to_ldouble( const char * z , long double * val , const char point ) ;
int cget_line( char * s, const char * msg, const size_t nb )
{ int c ;
size_t w = 0 ;
if( s == NULL || ! nb ) return 2 ;
if( strlen(msg) > 0 ) printf("%s", msg ) ;
fflush(stdout) ;
while ((c = fgetc (stdin)) != '\n' && c != EOF)
{
if( w < nb - 1 )
s[w++] = c;
else
{
while((c = fgetc(stdin)) != '\n' && c != EOF);
return 1 ;
}
}
s[w] = '\0';
return 0 ;
}
int string_to_ldouble( const char * z , long double * val , const char point )
{
int sign = 1 ;
long double po = 1 ;
long double v = 0.0 ;
size_t i = 0 ;
if( z == NULL ) return -1 ; // la chaîne est null
while( z[i] == ' ') i++ ;
if( z[i] == '\0' ) return 1 ; // la chaîne est vide
if( z[i] == '-' ) sign = -1 ;
if( z[i] == '+' ) sign = 1 ;
if( z[i] == '+' || z[i] == '-' ) i++ ;
while( z[i] == ' ' ) i++ ;
if( z[i] == '\0' ) // il n'y a plus rien apès le signe
{
return 2 ;
}
for( ; z[i] && ( isdigit(z[i]) ) ; i++ )
v = v * 10 + ( z[i] - '0' ) ;
if( z[i] != point )
{ while ( z[i] )
if ( z[i++] != ' ' ) return 3 ; // est-ce un entier ?
}
else
if( z[i] == point && isdigit(z[i+1] ) )
{
i++ ;
for( ; z[i] && ( isdigit(z[i] ) ) ; i++ )
{
po *= 10 ;
v = v + ( z[i] - '0' ) / po ;
}
}
while ( z[i] )
if ( z[i++] != ' ' ) return 4 ; // la fin de la chaîne est-elle propre ?
v = sign * v ;
*val = v ;
return 0 ; // zéro pas de problème
}
void do1()
{ char z[80] ;
int r = 1 ;
int res = 0 ;
long double d = 0 ;
while( d != -99 )
{ memset( z, 0 , sizeof(z) ) ;
d= 0.0;
r = cget_line( z, "saisir un double -99 pour quitter\n", sizeof(z)-1 ) ;
if( r == 2 )
{ printf("erreur globale\n") ;
continue ;
}
else
if( r == 1 )
{ printf("saisie trop longue\n") ;
continue ;
}
res = string_to_ldouble( z, &d, '.' ) ;
if( res != 0 )
{ printf("erreur conversion res= %d\n", res ) ;
continue ;
}
else
printf("Double= %Lf\n", d ) ;
}
}
int main( int argc , char * argv [] )
{
do1() ;
return 0 ;
}
///////////fin |
Partager