OVH Cloud OVH Cloud

Problème C++

106 réponses
Avatar
Steph
boujour

J'ai créé un programme dont voici une partie :


#include <iostream>
using namespace std;

int main (void)

{
char pw[20];
const char valide[20]="12H12";

cout << " Password :";
cin >> pw;

while (strcmp(pw,valide) = =1)

{

cout << " ACCESS REFUSED\n ";
cout << " Password :";
cin >> pw;

}


cout << "\n ACCESS GARANTED ";
}

Le problème est que si j'entre seulement le premiere lettre ou chiffre il
accepte alors que celles qui suivent sont fausses. Comment je peux faire
pour que le programme teste un à un les caratères?

merci

10 réponses

Avatar
kanze
Sylvain wrote:
James Kanze wrote on 25/06/2006 23:20:


[...]
preque par hasard, on touve dans le fil l'intégralité des
codes retours (1, 0 et -1)


Ce n'est pas du tout l'intégralité des codes de retour de
strcmp non plus.


ah bon, merci de ne les lister, ne fournir de pointeur (url)
pour nous permettre de progresser alors; merci aussi de ne pas
avoir fourni cette info en réponse au PO ni au post listant
ces 3 codes.


Je ne vais pas les lister, vue leur nombre. Mais strcmp peut
renvoyer en principe n'importe quelle valeur que peut prendre un
int ; dans la pratique, la plupart des implémentations
renvoient bien des valeurs arbitraires entre -255 et 255.

Quant à ma référence, c'est ISO 8859:1999. Mais la version
1990 disait la même chose, ainsi que les pages de man des
premiers Unix, et tous les Unix depuis, ainsi que les pages de
référence chez Dinkumware (qui est l'auteur de la bibliothèque
standard fournie avec VC++).

C'est quoi, strcmpi ?


l'ancien nom de stricmp il me semble, on le trouve encore dans
certain string.h


Et c'est quoi, stricmp ? Elle n'est pas présente dans
<string.h>, au moins pas si le compilateur est conforme. Sur les
deux machines auxquelles j'ai accès, elle n'est pas présente de
tout sur une (Sparc, sous Solaris), et présente dans la
bibliothèque kpathsea (partie de TeX) sur l'autre (PC, sous
Linux).

Sauf que c'est facile à éviter des complications quand on
accepte de ne pas être correct.


?? tu voulais dire quoi ?


Que montrer un programme erroné pour essayer de prouver qu'il
existe une solution qui n'est pas excessivement complexe
n'avance rien.

Donc, il te faut une complication en plus pour traiter le
cas.


oui, tout à fait, une ENORME complication genre c==EOF, énorme!


Reste qu'il y avait assez de complications en tout que tu n'as
pas su le faire correctement la première fois.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
Jean-Marc Bourguet
"kanze" writes:

oui, tout à fait, une ENORME complication genre c==EOF, énorme!


Reste qu'il y avait assez de complications en tout que tu n'as
pas su le faire correctement la première fois.


Et la comparaison avec EOF est une complication, pas enorme mais
piegeuse. A chaque fois il faut aller verifier que ce n'est pas un
char qui est compare a EOF (je l'ai fait ici).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
kanze
Sylvain wrote:
Gabriel Dos Reis wrote on 26/06/2006 04:50:
Sylvain writes:

| Gabriel Dos Reis wrote on 26/06/2006 02:54:
| > Sylvain writes:
| > [...]
| > | > C'est quoi, strcmpi ?
| > | | l'ancien nom de stricmp il me semble,
| > ^^^^^^^^^^^^
| > ancien où ?

| déjà ancien et remplacé par macro en stricmp en 1991 pour
les distrib | que j'ai regardé.

tu ne réponds toujours pas à la question posée.


tu connais Google ? 49200 réponses


Et je trouve 192000 réponses pour kpathsea. C'est donc une
fonction standard de C aussi ?

implémenté (d'expérience) par Microsoft, Watcom, Borland et
surement par tout compilateur conforme POSIX.


Implémenté dans la bibliothèque kpathsea de Web2C aussi. Au
moins dans la version que je connais -- rien n'interdit à
quelqu'un de l'implémenter, avec la sémantique qu'il veut.

Posix (comme la norme C) interdit sa présence dans <string.h>,
mais rien n'exclut qu'un système Posix ne l'implémente par
ailleurs. Solaris (qui est sans doute le système Posix le plus
répandu) ne l'a pas, au moin ni dans les pages de man, ni dans
les en-têtes sous /usr/include.

Alors, il y a une chose que je ne comprends pas. Est-ce que tu
pourrais m'indiquer la référence Posix, pour que je puisse
envoyer un rapport d'erreur à Sun.

| > chez qui ?

| chez qui quoi ?

Cette fonction est inexistante de la définition de C. Donc
si tu en


quelle définition ? dire "non conformité" sans citer son
referee est un peu léger.


La référence en ce qui concerne la conformité est simple :
ISO 9899:1999 pour la C, et ISO 14882:1998 (qui inclut
ISO 9899:1990 par référence) pour le C++. J'ai une version PDF
des deux premières en ligne, et une copie de la troisième sur
papier chez moi, mais j'ai beau chercher, je ne trouve pas de
stricmp. Ça doit être la fonction de récherche d'Acroread qui
est cassé ; est-ce que tu pourrais m'indiquer le numéro de la
section, pour que je puisse l'apprendre ? (Et encore, envoyer
un rapport d'erreur à Sun. Et à gcc, pour la bibliothèque
standard sous Linux.)

parles, c'est que tu as dû l'apercevoir chezx quelqu'un, non ?

| > Et qu'est-ce que c'est « stricmp » ?

| tu ne connais pas les librairies standard C ?

Je connais la bibliothèque standard C.


tu montres que ce n'est pas le pas.


Je sais que Gabriel a accès aux documents que j'ai cités
ci-dessus, et qu'il n'hésite pas à s'en servir. (Bien que pour
des détails de ce genre, je doute que ce soit nécessaire. Ce
sont le genre de choses qu'on connaît d'office si on connaît le
C ou le C++.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
kanze
Sylvain wrote:
James Kanze wrote on 25/06/2006 23:26:
Sylvain wrote:
James Kanze wrote on 24/06/2006 13:11:

j'ai de très fortes doutes ...


moi aussi j'avais de très fort doutes constatant que
'Gabi Software' n'est enregistré sur aucun registre de
commerce


Tu n'as pas dû régarder celui de Versailles. St,-Cyr se
trouvant dans les Yvelines, c'est bien celui dont elle
dépend.


ok, elle n'enregistre pas ses résultats alors, ou les
administrations compétentes ont encore des progrès à faire (ce
qui est surement vrai indépendament de cette remarque
d'ailleurs).


Ça ne serait pas plutôt que tu ne sais pas chercher ? Parce que
j'y suis bien inscrit, et sous le nom Gabi Software, et sous le
nom James Kanze. (J'avoue que je ne saurais pas te dire comment
chercher. Je sais que depuis que ce n'est plus une Sàrl, je n'ai
pas de KBis. Mais je suis bien inscrit comme profession
libérale, commerçante sous le nom de Gabi Software, et j'ai un
numéro TVA intercommunitaire, et un numéro Siret, et que sais-je
d'autre.)

et 'gabi-soft.fr' non déclaré comme domaine.


Elle ne sert pas actuellement, pour diverses raisons, mais il
m'appartient. Depuis 1994, environ.


il t'appartient et l'afnic ne le sait pas !!?!

décidement tu es en enregistré partout et "ils" font exprès de
perdre/nier tes records, byzarre.

"utiliser" n'est pas détenir, gabi-soft.fr est disponible pour
n'importe qui à 6,50 euro depuis une semaine; donnes-toi
l'occassion de couvrir à posteriori tes affirmations.


Depuis une semaine ?

J'aurais dû dire qu'il m'appartenait. (Mais la gestion des noms
a tellement changé dernièrement que je ne sais pas où j'en suis.
Dans la passée, j'ai eu un mal fou de le garder quand j'ai
changé la forme juridique ; on m'insistait qu'il était pris par
l'ancienne société. Que j'avais liquidée trois ans auparavent.
Et qu'on ne m'a laissé reprendre qu'après avoir apporté les
extraites de l'actes de liquidation, et un extrait du régistre
de commerce qui signifiait que j'utilisais le nom Gabi Software
commerciellement.)

ce nouveau 'neuf.fr' dissipe mes doutes, comme quoi il y
a surement plein de façons d'être professionnel. :)


Tant que je n'ai pas trouvé de fournisseur « professionnel
», qui marche de façon stable et fiable, ma connectivité va
bien


?!? ta connectivité locale n'a rien à voir avec une possession
de domaine.


C'est une question de qui gère la site. Dans mon cas,
actuellement (et je ne suis pas sûr combien de temps ça va
durer), je me herberge chez Neuf, parce que c'est compris dans
mon abonnement ADSL. Et que si je voulais utiliser un nom autre
que celui qu'il m'ont donné, il faudrait que je paie, or que ce
n'était jamais le cas avant.

évoluer. Gabi Software a beau exister, en diverses formes,
depuis 1989, elle reste quand même une petite boîte, pas
assez grande pour justifier une ligne loué et d'agir comme
son propre fournisseur.


comprends pas non plus; la plupart des sociétés (et quasi tous
les particuliers) sont hébergés et passent par le réseau
public pour utiliser / gérer leur location - en caricaturant
un peu seuls les universitaires s'auto-hébergent sur renater.


Mes clients s'herbergent eux-même, pour la plupart. Mais j'avoue
qu'ils ne sont pas n'importe qui : Crédit Agricole, T-Mobil,
Dresdner Bank, Alcatel...

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34




Avatar
kanze
Sylvain wrote:
James Kanze wrote on 23/06/2006 20:06:
Sylvain wrote:

[...]
je mets plutot un flush avant chaque nouvel input.


Et depuis quand est-ce qu'un flux en entrée supporte un flush ?


btw, depuis 1990 également (et présent dans les distrib.
récentes).


Il n'y a pas de fonction std::istream::flush() en C++. Le
programme suivante :

#include <iostream>
#include <istream>

int
main()
{
std::cin.flush() ;
return 0 ;
}

ne compile ni avec Sun CC, ni avec g++ (et ne doit pas compiler
selon ISO 14882:1998). A priori, quand on parle de « flush »
ici (un group C++), c'est bien de std::ostream::flush qu'on
parle, parce que c'est la seule fonction flush en C++.

En C (ISO 9899:1999), la norme dit pour fflush « If stream
pointes to an output stream or an update stream in which the
most recent operation was not input, the fflush function causes
any unwritten data for that stream to be delivered to the host
environment to be written to the file; otherwise, the behavior
is undefined. » (Et aussi que si stream est un pointeur null,
fflush « performs this flushing action on all streams for which
the behavior is defined above. ») C'est donc un comportement
indéfini sur un flux d'entrée.

Ce n'est donc pas de fflush que tu parles non plus.

Et rien de ce qui précède a changé récemment. Avec Sun CC, j'ai
encore accès à la version pré-standard de <iostream.h> (qui,
dans le cas de Sun, correspond exactement à la version USL
d'environ 1988, voire avant), et cin.flush() provoque une erreur
de compilation aussi. De même, la norme Posix reprend la
définition de fflush mot-à-mot de la norme C que j'ai déjà cité.

prototype: int flushall(void);
definition: stdio.h
action: vide toutes les mémoires tampons associées à des flux.
description: vide toutes les mémoires tampons associées aux flux
d'entrée ouverts, et écrit dans les [...] aux flux de sorite ouverts.


Encore, tu trouves des fonctions qui ne sont pas dans ma copie
de la norme. Je ne sais pas où tu trouves ta documentation, mais
je te conseille de trouver une source plus fiable. Parce que les
fonctions « standard » dont tu parles n'existent ni dans la
norme, ni dans les compilateurs auxquels j'ai accès.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
kanze
Sylvain wrote:

Si ton but, c'est de disparager Microsoft, en prouvant que leur
compilateur n'est pas conforme...

/***
*stdio.h - definitions/declarations for standard I/O routines

* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserv ed.
*
*Purpose:
* This file defines the structures, values, macros, and functions
* used by the level 2 I/O ("standard I/O") routines.
* [ANSI/System V]
*
* [Public]
*
****/


[...]
_CRTIMP int __cdecl _flushall(void);


Pas de problème ici. Une implémentation a le droit de définir
tout ce qu'elle veut en plus à portée référentielle, pourvue que
le nom commence par un _. (Les en-têtes de g++ sont plein des
choses comme _M_... Ce n'est pas pour autant que je les
considère partie de la norme.)

[...]
#if !__STDC__ && !defined(_POSIX_)

/* Non-ANSI names for compatibility */


Note bien la compilation conditionnelle et le commentaire !

#define P_tmpdir _P_tmpdir
#define SYS_OPEN _SYS_OPEN

_CRTIMP int __cdecl fcloseall(void);
_CRTIMP FILE * __cdecl fdopen(int, const char *);
_CRTIMP int __cdecl fgetchar(void);
_CRTIMP int __cdecl fileno(FILE *);
_CRTIMP int __cdecl flushall(void);
_CRTIMP int __cdecl fputchar(int);
_CRTIMP int __cdecl getw(FILE *);
_CRTIMP int __cdecl putw(int, FILE *);
_CRTIMP int __cdecl rmtmp(void);
_CRTIMP char * __cdecl tempnam(const char *, const char *);
_CRTIMP int __cdecl unlink(const char *);

#endif /* __STDC__ */


Alors, si ton but était de prouver que Microsoft faisait des
choses non conforme, c'est raté. Ils ont bien pris les
précautions de rigueur (cette fois-ci, au moins).

Et évidemment, rien ici ne dit quoique ce soit sur le
comportement de flushall (que je suppose être le même que
fflush( NULL ), et donc, de ne faire le flush que sur les flux
où c'est défini).

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Emmanuel Delahaye
| > | > C'est quoi, strcmpi ?
| > | | l'ancien nom de stricmp il me semble,
| > ^^^^^^^^^^^^
| > ancien où ?
| | déjà ancien et remplacé par macro en stricmp en 1991 pour les distrib
| que j'ai regardé.


implémenté (d'expérience) par Microsoft, Watcom, Borland et surement par
tout compilateur conforme POSIX.


Euuhhh d'après http://www.unix.org/single_unix_specification/, strcmpi()
et stricmp() : fonctions inconnues ...

Cette fonction est inexistante de la définition de C. Donc si tu en


quelle définition ? dire "non conformité" sans citer son referee est un
peu léger.


La définition du C est unique. C'est ISO/IEC 9899:xxxx avec des versions :

C90 : ISO/IEC 9899:1990
C95 : ISO/IEC 9899:1990 corr 1995
C99 : ISO/IEC 9899:1998
C05 : ISO/IEC 9899:1999 corr 2004

--
A+

Emmanuel Delahaye


Avatar
Sylvain
Emmanuel Delahaye wrote on 26/06/2006 19:47:

Euuhhh d'après http://www.unix.org/single_unix_specification/, strcmpi()
et stricmp() : fonctions inconnues ...


merci Emmanuel de cette confirmation.

je ne pourrais donc que l'utiliser dans ce tout petit monde des pécé.

Sylvain.

Avatar
Xavier Roche
je ne pourrais donc que l'utiliser dans ce tout petit monde des pécé.


On peut aussi utiliser str(n)casecmp qui est un peu plus courante, et
pour WIN32, définir:

#ifdef _WIN32
#define strcasecmp(a,b) stricmp(a,b)
#define strncasecmp(a,b,n) strnicmp(a,b,n)
#endif

(déja indiqué ici même, il me semble)

Avatar
Sylvain
kanze wrote on 26/06/2006 11:18:

A priori, quand on parle de « flush »
ici (un group C++), c'est bien de std::ostream::flush qu'on
parle, parce que c'est la seule fonction flush en C++.


ah, quand on "parle", c'est obligeatoirement pour réciter ISO 9899 ?!?

désolé mais moi je flushe (tu flushes, il flushe) en tant que
traitement, s'il faut un accès DMA, une int. ou une API propriétaire
supportée par 100% des compilos que j'utilise cela me va très bien.

tu trouves des fonctions qui ne sont pas dans ma copie de la norme


oui et alors, c'est interdit par la même norme ?

je te conseille de trouver une source plus fiable. Parce que les
fonctions « standard » dont tu parles n'existent ni dans la
norme, ni dans les compilateurs auxquels j'ai accès.


- je n'ai jamais dit « standard »
- je n'utilise pas /tes/ compilos (ma Sparc, avec cc et gcc, est sous
les étagères depuis 10 ans - si quelqu'un veux un GDM-1962B il est nickel).

Sylvain.