Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Aller à la page:  1 2 Page suivante
Page: 1 sur 2
chaine de caracteres en C
Envoyé par: oliv

salut a tous

comment faire pour recuperer la chaine de caractaires entre a l ecran pour la reutiliser avec l instruction printf.

exemple du code utilise:

scanf("%c:\n",&prenom);
printf("%c est arrive",prenom);

Merci et A+@:-)

Poste le Thursday 31 March 2005 19:08:46
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: Zeurkk

Une chaine de caractere entré a l'écran !! tu veux dire entré au clavier.
Pour une chaine c'est : scanf("%s",&variable)

Poste le Thursday 31 March 2005 19:47:29
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: mute

n'oublie pas d'allouer la mémoire pour stocker la chaine de caractère...

tu peux également utiliser la fonction

char *fgets(char *s, int size, FILE *stream);

(avec stdin comme stream). Elle est moins puissante que scanf (au niveau du formatage) mais qui permet de ne pas oublier les problèmes de débordement de mémoire. Je ne sais pas si scanf permet cela. D'ailleur si quelqu'un a la réponse çà m'intéresse, à la lecture du man je dirai non.

Poste le Thursday 31 March 2005 21:22:26
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: Raph__

Salut mute,
scanf le permet, mais attention... :

// test.c
main ()
{
char tab[4];

scanf ("%3s", tab);
printf ("%s\n", tab);
return 0;
}

$ cc test.c
$ ./a.out
azerty
aze
$

Jusque là tout va bien, mais essayons ca :

{
...
scanf ("%3s", tab);
printf ("%s\n", tab);
scanf ("%3s", tab);
printf ("%3\n", tab);
...
}

$ ./a.out
azerty
aze
rty

Pour éviter ce problème on peut utiliser la fonction fflush pour vider stdin.

A Ciao smiling smiley



Poste le Thursday 31 March 2005 23:44:43
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: Raph__

dans le deuxième expemple c'est : printf ("%s\n", tab); en dernière ligne et non printf ("%3\n", tab);
smiling smiley)

Poste le Thursday 31 March 2005 23:48:15
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: mute

merci

Poste le Thursday 31 March 2005 23:56:18
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: Raph__

encore moi...
J'ai dit une betise pour fflush, je pensais que l'on pouvait utiliser cette fonction pour vider stdin. Mais aprés lecture de mon cher K&R, je me suis apercu du contraire :
"Sur un flot de sortie, fflush provoque l'écriture des données mises en mémoire tampon ;sur un flot d'entrée, son effet est indéfini".

Dans l'immédiat je ne vois pas d'autre solution que d'utiliser getchar. (ca ne me plait pas du tout).

scanf...
printf...
while ((c = getchar ()) != '\n')
;
scanf...
printf...

Je vais essayer de chercher (google) une meilleure solution pour vider stdin.


Poste le Friday 1 April 2005 01:08:55
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: mute

Citation
Raph__
Mais aprés lecture de mon cher K&R
C'est quoi ce bouquin ?

[www.eskimo.com] -> "There is no standard way to discard unread characters from a stdio input stream"

ta méthode semble être celle utilisée la plupare du temps (en ajoutant EOF)

Je vais enfin pouvoir utiliser scanf comme il faut, merci




Poste le Friday 1 April 2005 09:49:49
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: cancerus

Bonjour,

K&R pour
Langage C norme ANSI de Brian W. Kernighan et Dennis M. Ritchie.
En résumé la bible des développeurs C :-)

Poste le Friday 1 April 2005 10:19:49
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: ceric35

par ce que vous developper en norme ANSI ?

pour mes projet j'ai l'option -Wall , mais si je rajoute -ansi dans le makefile

et bien , c'est vachement restrictif quand meme ...

ca doit etre possible , mais j'ai la fleme ;-)

-------------------------------------------------------------------------------------------------
Linux est pour la firme de Redmond ce qu'est James Bond pour les
méchants dans les films : le dernier obstacle avant la domination mondiale.

Poste le Friday 1 April 2005 11:10:22
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: Morgan

Fais une recherche sur ce forum, sve@r avait proposé une macro pour reproduire le comportement de fflush(stdin) .

___________________________________________________
L'interface chaise-clavier se débuggue elle aussi...

Poste le Friday 1 April 2005 12:42:44
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: ceric35

voila celle que j'utilise :

void lire_chaine(char *chaine,unsigned int taille) {
	int c;
	unsigned int i=0;
	do {
		if ((c=getchar())!='\n') {
			chaine[i++]=c;
		}
	} while ((c!='\n') && (i<taille-1));
	chaine='\0';

	// vidage du buffer
	if(c!='\n') {
		do {
			c=getchar();
		} while (c!='\n');
	}
}

-------------------------------------------------------------------------------------------------
Linux est pour la firme de Redmond ce qu'est James Bond pour les
méchants dans les films : le dernier obstacle avant la domination mondiale.

Poste le Friday 1 April 2005 14:15:18
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: Raph__

Salut,
Morgan parlait d'une macro...
Ca devrait resembler à ça :
#define clr_stdin while (getchar () != '\n')

(voir à ajouter EOF, pour prise en compte du ctrl-d).
Enfin bon, ca reste à mon humble (!) avis de la bricole. smiling smiley
J'ai pas trouvé la macro proposé par sve@r, si ça se trouve c'est mieux...

Poste le Friday 1 April 2005 20:28:31
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: Morgan

c'était sur ce thread:

[lea-linux.org]

___________________________________________________
L'interface chaise-clavier se débuggue elle aussi...

Poste le Friday 1 April 2005 20:51:57
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: ceric35

Citation

Morgan parlait d'une macro...
je contibue avec une FONCTION !

C'est juste une autre solution ...

-------------------------------------------------------------------------------------------------
Linux est pour la firme de Redmond ce qu'est James Bond pour les
méchants dans les films : le dernier obstacle avant la domination mondiale.

Poste le Friday 1 April 2005 21:26:32
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: Sve@r

Citation
Morgan
Fais une recherche sur ce forum, sve@r avait
proposé une macro pour reproduire le comportement
de fflush(stdin) .

__________________________________________________
_
L'interface chaise-clavier se débuggue elle
aussi...

Merci de me citer...

J'avais en effet proposé une macro pas du tout portable pour vider le tampon "stdin" (et accessoirement pour vider n'importe quel tampon).
La macro est la suivante:
#define FFLUSH(flux) ((flux)->_IO_read_ptr=NULL,\
(flux)->_IO_read_end=NULL,\
(flux)->_IO_read_base=NULL,\
(flux)->_IO_write_ptr=NULL,\
(flux)->_IO_write_end=NULL,\
(flux)->_IO_write_base=NULL)

Mais depuis, j'ai appris des trucs
1) sous Linux, il existe la fonction "fpurge(flux)" ou "_fpurge(flux)" qui vide le flux sans le traiter (idéal pour vider "stdin")

2) en fait, quand c'est vraiment bien programmé, on n'a jamais besoin de vider "stdin" comme un "ouf" parce que, quand c'est bien programmé, on sait en permanence ce que contient "stdin" et on peut toujours effacer (avec des "getchar()") ce qu'il y a en trop

Poste le Friday 1 April 2005 21:41:16
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: Raph__

Citation
ceric35
je contibue avec une FONCTION !
Ce n'était pas une reproche smiling smiley
C'est trés bien de donner une autre solution, d'ailleurs je vais en mettre une moi aussi smiling smiley)

Citation

void readstring (char *ptr, int size_stg)
{
_int c;

_while ((c = getchar ()) != '\n' && c != EOF)
____{
______if (size_stg)
______{
________*(ptr++) = c;
________size_stg--;
______}
____}
_*ptr = '\0';
_return;
}
(quelqu'un sait comment on peut identer ?)(on y voit rien).

Tout les caractères sont lus, on stock uniquement le nombre de char qu'on veut, stdin est "propre".
On pourrait mettre :
Citation

while...
{
if (size_stg-- > 0)
*(ptr++) = c;
}
et comme return :
Citation

return !size_stg ? 0 : 1
Inconvénient, on décremente à chaque tours. (On pourrait ajouter une condition, mais ca ne vaut pas le coup à mon avis...)
Avantage, on est capable de dire si l'utilisateur à rentré le bon nombre de caratère.

Citation
Sve@r
1) sous Linux, il existe la fonction "fpurge(flux)" ou "_fpurge(flux)" qui vide le flux sans le traiter (idéal pour vider "stdin")

Je n'ai pas cette fonction sur ma debian.

Petite parenthèse pour Sve@r, Taz est drolement virulant ! Sur léa tout le monde est gentil, c'est un plaisir.

A bientôt les gens gentils de léa smiling smiley


Poste le Sunday 3 April 2005 13:25:11
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: Sve@r

Citation
Raph__
ceric35 a écrit :
Sve@r a écrit :1) sous Linux, il existe la
fonction "fpurge(flux)" ou "_fpurge(flux)" qui
vide le flux sans le traiter (idéal pour vider
"stdin")

Je n'ai pas cette fonction sur ma debian.
Dommage. Peut-être que tu peux récupérer le source sur Mandrake. Sinon ma macro fait pareil

T'as un manuel online "[man.he.net"]; qui t'en parle

Citation
Raph__
ceric35 a écrit :
Petite parenthèse pour Sve@r, Taz est drolement
virulant ! Sur léa tout le monde est gentil, c'est
un plaisir.
Ah ? T'as eu le plaisir de faire la connaissance avec Taz ? Condoléances grinning smiley
Je me suis bien frité avec lui l'hiver dernier, surtout à propos de "fflush". Il te prend vraiment pour de la m... quand il te dit des trucs... mais il a raison à propos de "fflush". On n'a pas besoin de flusher (ou purger) "stdin" car on doit toujours savoir ce qu'il y a en trop ce qui permet de vider manuellement ce tampon.
J'ai expliqué ça plus en détail dans le forum hardware sur ce post[forum.hardware.fr]


Poste le Sunday 3 April 2005 20:56:41
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: ceric35

"ceric35 a écrit ..." ?-( j'ai rien ecrit du tout

-------------------------------------------------------------------------------------------------
Linux est pour la firme de Redmond ce qu'est James Bond pour les
méchants dans les films : le dernier obstacle avant la domination mondiale.

Poste le Sunday 3 April 2005 21:15:34
Répondre     Citer    
Re: chaine de caracteres en C
Envoyé par: Raph__

Salut Sve@r,
J'ai bien la fonction fpurge, mais pas de manuel qui en parle, enfin je n'en ai pas trouvé sur mon système. En cherchant le manuel fpurge à l'adresse que tu as donné ("[man.he.net"]winking smiley, je suis tombé sur (entre autre):
BUGS
Linux may not support fpurge.

J'ai commencé à douter, mais en cherchant sur google j'ai trouvé un manuel de fpurge [www.annodex.net]
(voir la section "CONFORMING TO").
Et celui-ci m'a mis sur la voie, en fait la fonction s'appelle __fpurge, deux underscore.
La fonction __fpurge est déclarée dans le fichier d'en-tête stdio_ext.h
Bien que je ne pense pas utiliser cette fonction (pas plus qu'une autre solution pour vider stdin), je suis content de savoir qu'elle existe.

Merci ! smiling smiley

(Je ne connais pas taz, j'ai juste lu ta conversation avec lui, ca m'a bien fait rigoler).

A Ciao.


Poste le Monday 4 April 2005 14:51:14
Répondre     Citer    
Aller à la page:  1 2 Page suivante
Page: 1 sur 2

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
chaine de caracteres en C
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.
Nouveau sujet sur ce forum

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons