strcmp
Le
heron
Bonjour,
Pourquoi le code ci-dessous ne fonctionne pas comme il devrait? Nombre
invalide devraît s'afficher si '.' est entré?
D'ailleurs si buffer est un tableau de caractère, strcmp compare
chaque caractère avec '.'. La fonction strcmp devrait être
if( strcmp('.', buffer) == 0 ) car il s(agit d'un caractère seul
qui entre en comparaison?
Merci de m'éclairer.
do
{
ok = 1 ;
printf("%d. Nombre (fin par \"q\") : ", n+1 ) ;
fgets(buffer, 81, stdin) ;
if ( strcmp(".", buffer) == 0 )
{
printf("Nbr invalide.") ;
ok = 0 ;
}
} while ( !ok ) ;
Pourquoi le code ci-dessous ne fonctionne pas comme il devrait? Nombre
invalide devraît s'afficher si '.' est entré?
D'ailleurs si buffer est un tableau de caractère, strcmp compare
chaque caractère avec '.'. La fonction strcmp devrait être
if( strcmp('.', buffer) == 0 ) car il s(agit d'un caractère seul
qui entre en comparaison?
Merci de m'éclairer.
do
{
ok = 1 ;
printf("%d. Nombre (fin par \"q\") : ", n+1 ) ;
fgets(buffer, 81, stdin) ;
if ( strcmp(".", buffer) == 0 )
{
printf("Nbr invalide.") ;
ok = 0 ;
}
} while ( !ok ) ;

Poser une question


Ben non. En fait ce sujet a déjà été abordé sur le ng.
Le soucis (outre l'absence de vérif sur la valeur de retour de fgets()
mais qui n'est pas essentiel pour ton problème actuel), c'est quand tu
entres '.' au clavier, le buffer contient en *réalité* '.' suivi de 'n'
et enfin suivi de ' ', donc tu cherches à comparer "." et ".n", ce qui
explique le phénomène ce que tu observes.
==> man fgets (la partie interressante est dans les >> ... << vers la
fin de la citation)
FGETS(3) NEWLIB
NAME
4.12 'fgets'--get character string from a file or stream
SYNOPSIS
#include char *fgets(char *BUF, int N, FILE *FP);
DESCRIPTION
Reads at most N-1 characters from FP until a newline is
found. The characters >>including to the newline<< are stored in
BUF. The buffer is terminated with a 0.
non, fais un "man strcmp":
STRCMP(3) NEWLIB
NAME
--character string compare
SYNOPSIS
#include int strcmp(const char *A, const char *B);
Strcmp() veut deux adresses de chars (qui sont des tableaux dont le
dernier élément doit être un ' ' pour que ça marche toujours). Quand tu
passes "." tu passes fort justement l'adresse d'un tel tableau qui est
construit pour toi par le compilo quelque part en mémoire. Quand tu
utilises '.' tu passes uniquement le code ASCII du caractère. Ca n'a
rien à voir.
Si tu cherches à savoir si le 1er caractère de buffer est un '.', il te
suffit de faire:
if(buffer[0] == '.')
Si enfin tu veux savoir si buffer contient un caractère '.' quelque
part, il te faut utiliser strchr():
==> man strchr
STRCHR(3) NEWLIB
NAME
--search for character in string
SYNOPSIS
#include char * strchr(const char *STRING, int C);
DESCRIPTION
This function finds the first occurence of C (converted to a
char) in the string pointed to by STRING (including the
terminating null character).
RETURNS
Returns a pointer to the located character, or a null pointer
if C does not occur in STRING.
sam.
wrote:
parfait,
merci
Qu'est-ce qui empeche le code ci-dessous de prendre en compte les
décimales?
#include #include #include #include
#define YES 'o'
int main(void)
{
char buffer[81] ;
double num[50] ;
char rep1, rep2 ;
int i, n, ok ;
int dpoint, start, end ;
double *s, *e, sum ;
int c ;
char *ptr_end ;
n = 0 ;
do /* DO 1 */
{
do /* DO 2 */
{
ok = 1 ;
printf("n%d. Nbr (fin par "q") : ", n+1 ) ;
fgets(buffer, 81, stdin) ;
if ( strchr(buffer, '.') != 0 ) /* If no valid conversion could
be performed then an zero value is returned. */
{
printf("nNbr invalide!n") ;
ok = 0 ;
}
else
{
i = 0 ;
dpoint = 0 ;
while ( buffer[i] != ' ' && ok )
{
if ( buffer[i] == '.' && dpoint == 0 )
dpoint = 1 ;
else if ( !isdigit(buffer[i]) && !(strcmp("q", buffer) ) )
{
printf("nNbr invalide : n") ;
ok = 0 ;
}
i++ ;
}
} /* fin else */
} while ( !ok ) ; /* DO 2 */
if ( buffer[0] != 'q' )
{
num[n++] = strtod(buffer, &ptr_end) ;
}
} while ( buffer[0] != 'q' && n < 50 ) ; /* DO 1 */
if ( n > 0 )
{
if ( n > 49 )
printf("nCapacite epuise.n") ;
printf("n%d nombre ont ete saisis.n", n) ;
printf("nAfficher le tableau ? (o/n)") ;
if ( rep1 = (getchar() == YES) )
{
printf("n") ;
for ( i = 0 ; i < n ; i++ )
printf("nValeur no %d : t%fn", i+1, num[i]) ;
printf("nn") ;
while ( c = getchar() != 'n' )
;
}
}
printf("nTotaliser le tableau ? (o/n)") ;
if ( rep2 = ( getchar() == YES ) )
{
printf("nDu nombre no : ") ;
scanf("%d", &start) ;
while ( start < 0 || start > n )
{
printf("nDebut de zone invalide!n") ;
printf("nDu nombre no : ") ;
scanf("%d", &start) ;
}
printf("nAu nombre no : ") ;
scanf("%d", &end) ;
while ( end < 0 || end > n )
{
printf("nFin de zone invalide!n") ;
printf("nDu nombre no : ") ;
scanf("%d", &end) ;
}
s = &num[start-1] ;
e = &num[end-1] ;
sum = 0.0 ;
while ( s <= e )
sum += *s++ ;
printf("nLa somme des valeurs %d a %d est de : %fn", start, end,
sum) ;
}
printf("nn") ;
return 0 ;
}
S'il y a un '.' quelque part dans la chaîne BUFFER....
... dire que « c'est invalide »
... et ne pas traiter BUFFER.
Antoine
le 10/05/2010 à 16:31, heron a écrit dans le message
fflush(stdout); /* pour être sûr que ta ligne s'affiche */
strchr retourne un char* ; on écrit plutôt
if (strchr(buffer, '.') != NULL) {
ou
if (strchr(buffer, '.')) {
ensuite ici tu dis : si buffer contient un « . »,
ça n'a pas de sens puisque juste avant tu as vérifié qu'il n'y avait pas
de « . ».
pas besoin des parenthèses : && !strcmp("q", buffer)) {
fflush(stdout);
if ((rep1 = getchar()) == YES) {
while ((c = getchar()) != 'n';
fflush(stdout);
if ((rep2 = getchar()) == YES) {
fflush(stdout);
Il faut vraiment tester le retour de scanf pour savoir si il a
fonctionné car sinon start peut contenir n'importe quoi.
fflush(stdout);
même remarque que précédemment
même remarques que précédemment
même remarques que précédemment
--
Benoit Izac