OVH Cloud OVH Cloud

Vider le buffer associe a stdin

98 réponses
Avatar
korchkidu
Bonjour,

je me pose une question par rapport a la maniere classique de vider le
buffer associe a stdin:

c = getchar();
if (c != ’\n’)
while ( (getchar()) != ’\n’) {
};

Que se passe t-il si stdin ne contient aucun \n? (fichier contenant une
ligne mais aucun \n par exemple). Dans ce cas, il me semble que l'on
pourrait avoir un probleme non?

Comment feriez vous pour resoudre ce probleme? (J'ai bien une petite
idee mais je prefere savoir si c'est la bonne..;) )

Merci d'avance pour vos reponses,
K.

10 réponses

Avatar
Gabriel Dos Reis
drkm writes:

| Emmanuel Delahaye writes:
|
| > il me semble que
| > ce qui est extern "C" n'est pas soumis aux lois du C++
|
| Pas pour ce qui est de l'analyse syntaxique.

Cela ne s'arrête pas à l'analyse syntaxique -- du point de vue de C++,
c'est du C++. Sémantique comprise.

-- Gaby
Avatar
Laurent Deniau
Emmanuel Delahaye wrote:
Jean-Marc Bourguet wrote on 08/11/04 :

Emmanuel Delahaye writes:

Jean-Marc Bourguet wrote on 08/11/04 :

Je ne connais pas assez le C++ pour l'affirmer, mais il me semble
que ce
qui est extern "C" n'est pas soumis aux lois du C++, mais à celles du
C.



Non. C'est du C++, la seule chose est que la génération de
code est compatible avec le C (p.e. le name mangling est
celui du C -- ce qui fait qu'une seule fonction extern "C"
peut avoir un nom donné par exemple -- les conventions
d'appel sont celles du C, ...)



M'embête, lui... et mes beaux this alors ?



Tu fais comme en SmallTalk, tu utilises self.



Good! C'est pas déposé au moins ?


Si, c'est Objective-C.

a+, ld.





Avatar
Charlie Gordon
"Emmanuel Delahaye" wrote in message
news:
Jean-Marc Bourguet wrote on 08/11/04 :
Je ne connais pas assez le C++ pour l'affirmer, mais il me semble que ce
qui est extern "C" n'est pas soumis aux lois du C++, mais à celles du
C.


Non. C'est du C++, la seule chose est que la génération de
code est compatible avec le C (p.e. le name mangling est
celui du C -- ce qui fait qu'une seule fonction extern "C"
peut avoir un nom donné par exemple -- les conventions
d'appel sont celles du C, ...)


M'embête, lui... et mes beaux this alors ?


Tu ruses :

#ifdef __cplusplus
extern "C" {
#define this this__
#endif

... ton bô code C tout plein de mots clés interdits ...

#ifdef __cplusplus
#undef this
}
#endif

C'est crade, je sais.

Chqrlie.



Avatar
Emmanuel Delahaye
Charlie Gordon wrote on 09/11/04 :
M'embête, lui... et mes beaux this alors ?


Tu ruses :

#ifdef __cplusplus
extern "C" {
#define this this__
#endif

... ton bô code C tout plein de mots clés interdits ...

#ifdef __cplusplus
#undef this
}
#endif

C'est crade, je sais.


C'est pas si mal...

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"


Avatar
drkm
Emmanuel Delahaye writes:

Charlie Gordon wrote on 09/11/04 :

M'embête, lui... et mes beaux this alors ?


Tu ruses :

#ifdef __cplusplus
extern "C" {
#define this this__
#endif

... ton bô code C tout plein de mots clés interdits ...

#ifdef __cplusplus
#undef this
}
#endif

C'est crade, je sais.


C'est pas si mal...


Bof. Ca dépend de « ton bô code C tout plein de mots clés
interdits », mais si c'est pour modifier l'interface que définit
l'en-tête selon que l'on compile avec un compilateur C ou C++ ...

~> cat fclc.h
#ifdef __cplusplus
extern "C" {
#define this this__
#endif

struct A {
struct A * this ;
} ;

#ifdef __cplusplus
#undef this
}
#endif

~> cat fclc.c
void f() {
struct A a ;
a->this = & a ;
}

~> cat fclc.cc
void g() {
struct A a ;
a->this__ = & a ;
}

Pas terrible.

--drkm



Avatar
Charlie Gordon
Pas terrible.


je suis d'accord. La bonne solution est d'éviter les mots clés du C++ dans du
code C. A fortiori dans des headers dont personne ne peut jurer qu'ils ne
seront jamais partagés avec du C++.

QED

Chqrlie.

Avatar
Emmanuel Delahaye
Charlie Gordon wrote on 10/11/04 :
Pas terrible.


je suis d'accord. La bonne solution est d'éviter les mots clés du C++ dans
du code C. A fortiori dans des headers dont personne ne peut jurer qu'ils ne
seront jamais partagés avec du C++.


Oui, ben ok, j'ai dejà dit que j'avais compris non ?

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"


Avatar
James Kanze
drkm writes:

|> Emmanuel Delahaye writes:

|> > il me semble que
|> > ce qui est extern "C" n'est pas soumis aux lois du C++

|> Pas pour ce qui est de l'analyse syntaxique. C'est au niveau du
|> code généré. C'est comme cela par exemple que ton linker s'y
|> retrouve.

Même pas. Les noms et les types qui y sont définis le sont selon les
règles de C, mais pour la reste -- il n'y a aucun problème à appeler une
fonction virtuelle dans une function définie extern "C", par exemple.

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

drkm writes:

|> Emmanuel Delahaye writes:

|> > il me semble que
|> > ce qui est extern "C" n'est pas soumis aux lois du C++

|> Pas pour ce qui est de l'analyse syntaxique. C'est au niveau du
|> code généré. C'est comme cela par exemple que ton linker s'y
|> retrouve.

Même pas. Les noms et les types qui y sont définis le sont selon les
règles de C, mais pour la reste -- il n'y a aucun problème à appeler une
fonction virtuelle dans une function définie extern "C", par exemple.


Bien sûr. J'ai du mal à saisir le rapport ...

--drkm

Avatar
Gabriel Dos Reis
James Kanze writes:

| drkm writes:
|
| |> Emmanuel Delahaye writes:
|
| |> > il me semble que
| |> > ce qui est extern "C" n'est pas soumis aux lois du C++
|
| |> Pas pour ce qui est de l'analyse syntaxique. C'est au niveau du
| |> code généré. C'est comme cela par exemple que ton linker s'y
| |> retrouve.
|
| Même pas. Les noms et les types qui y sont définis le sont selon les
| règles de C,

La norme C++ n'est pas d'accord avec toi, 7.5/4 :

[...] A C language linkage is ignored for the names of class members
and the member function type of class member functions. [Example:

[...]

extern "C" {
class X {
void mf(); // the name of the function mf and the member
// function's type have C++ language linkage
void mf2(void(*)()); // the name of the function mf2 has C++
language
// linkage; the parameter has type pointer to
// C function
};
}

--end example]

| mais pour la reste -- il n'y a aucun problème à appeler une
| fonction virtuelle dans une function définie extern "C", par exemple.

D'accord.

-- Gaby