Aller au menu - Aller au contenu

La saisie de texte sécurisée


Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page Précédente  1  2 
Pseudo Commentaire
Page Précédente  1  2 
Hors ligne jerod212 # Posté le 22/02/2009 à 21:34:41
Vive Xubuntu
Avatar

Et comment on fait si on veut récupérer du texte qui comporte des retour a la ligne, car normalement ces impossible avec cette fonction non? sinon bon travail.

Bonne journée^^!
 
Hors ligne gladiator.xerox # Posté le 23/04/2009 à 02:55:45

c super interessant merci
Hors ligne gladiator.xerox # Posté le 23/04/2009 à 02:59:39

je vous remercie infiniment matheo pour ce tuto, je suis encore débutant, et je me demande, ne serait ce pas plus simple d'utiliser une boucle contenant getch() pour la saisie d'une chaine caractère par caractère avec deux conditions d'arrêt, et sans avoir a vider le buffer, comme suit:

void lireChaine(char* chaine,int longeurMax)//longeurMax = taille du tableu de char
{
int i=0;
do
{
chaine[i]=getch();
if(i<longeurMax-1) cprintf("%c",chaine[i]);
i++;
}
while(i<longeurMax&&chaine[i-1]!='\r');
chaine[i-1]='\0';
}

l'avantage de cette fonction et de visualiser a l'utilisateur (qui ne connais pas la taille max)
sa chaine valide sans surprise. merci encore 20/20
Hors ligne gladiator.xerox # Posté le 26/04/2009 à 03:41:23

ou encore plus efficace
Hors ligne gladiator.xerox # Posté le 26/04/2009 à 03:47:39

celle la permet des back space.
Hors ligne gladiator.xerox # Posté le 27/04/2009 à 23:46:53

:p voila le code final perfectionné a l'extrême 5/5:

void saisirChaineXerox(char* chaine,int longeurMax)//longeurMax= taille tableau de char
{
char c;
int i=0,x,y;
x=wherex();
y=wherey();
do
{
c=getch();
if(c!='\b'&&i<longeurMax)
{
chaine[i]=c;
gotoxy(x+i,y);
if(i<longeurMax-1) cprintf("%c",chaine[i]);
i++;
}
else
if (i>0)
{
i--;
gotoxy(x+i,y);
cprintf(" ");
gotoxy(x+i,y);
}
}
while(c!='\r');
chaine[i]='\0';
}
Hors ligne salima123321 # Posté le 17/05/2009 à 00:13:50

Bonsoir m@teo,
Svp je veux te posé une question.
Est-ce qu'il existe en C une fonction prédéfinie qui permit de convertir un caractère a son code ascii?
Merci d'avance.
Hors ligne salima123321 # Posté le 19/05/2009 à 18:16:15

Aucune réponse !
Hors ligne youyounes # Posté le 24/05/2009 à 13:07:27

Est-que on peut recuperer deux nombre par ex 125 on recupere 12.Est-que c'est possible ?

Code : C++
1
2
3
bool to_be;
bool not_to_be;
bool the_question = to_be && "or" && not_to_be;
 
Hors ligne socket25 # Posté le 04/06/2009 à 08:45:37

Salut à tous.

Pour commencer merci beaucoup pour ce tuto qui m'a permis d'apprendre à programmer.
Et ensuite je tiens à préciser que lorsque on crée une variable, par exemple:

Citation
char var[5];


on peut y stocker maximum 5 caractères. Eh oui 5 et par 4. Parce que j'en avait marre de faire des déclarations du genre:

Citation
char var[5+1];


et j'ai remarqué que lorsque on met une chaîne de caractères dans cette variable, la première lettre se situe dans la case 0 et pas 1. Donc le caractère de fin \0 sera dans la case 5.

Pour ceux qui n'ont pas compris, en gros quand vous créez une variable char de 5 cases par exemple en fait vous avez une variable char de 6 cases.

Je vous mets un petit "tableau" pour que vous voyez de vous même comment la chaîne est stockée

0 | 1 | 2 | 3 | 4 | 5
m | a | t | e | o | \0

@+
Hors ligne Namiro # Posté le 27/06/2009 à 16:02:20

C'est pour embêter mon monde mais au tout début du chapitre dans l'introduction il y a une petite faute de frappe :p

"un peu le" et pas "un peule"

:p merci pour ces super tuto, moi qui ne connaissait rien à la programmation et qui voulais essayer d'en faire, mais je ne savais par ou débuté tellement il y a de choix.

Merci beaucoup au Site Du Zéro

Il est facile de commencer une guerre
Difficile d'y mettre un terme
Et impossible d'oublier
 
Hors ligne funtim78 # Posté le 30/06/2009 à 10:20:44
Que la déesse Elune te protège
Avatar

études : Supélec

tres bon tuto comme d'habitude, mais attention, il y a encore une erreur!
Quand tu introduis la fonction pour vider le buffer, tu as mis
while (c != '\n' || c != EOF)

alors aue c'est
while (c != '\n' && c != EOF)

C'est bien corrige dans les fichiers donnes a la fin, mais quand on copie-colle le code ca ne fonctionne pas ^^
 
Hors ligne Lekeau # Posté le 05/07/2009 à 00:33:11
Avatar

Lol justement j'allais le préciser car j'avais planter dessus et je me disais "non c'est pas possible que j'arrive encore a confondre || et &&. J'ai demandé sur le forum et finalement on s'est rendu compte de l'erreur ^^.
Comme quoi même notre grand mentor et manitou M@teo21 n'est pas invincible :D

En tout cas, je profite que je poste un commentaire, pour féliciter pour ce tuto complet, détaillé et compréhensible par tous :p
Hors ligne chichiri # Posté le 06/07/2009 à 17:55:42
Viva Lasagna
Avatar

Waw, c'est vrai que ce n'était pas facile :waw: mais bon, on a vaincu :ninja: . J'ai même réussi les exercices tout seul!
Code : C
 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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void viderBuffer()
{
    int c = 0;
    while (c != '\n' || c != EOF)
    {
        c = getchar();
    }
}
 
int lire(char *chaine, int longueur)
{
    char *positionEntree = NULL;
 
    if (fgets(chaine, longueur, stdin) != NULL)
    {
        positionEntree = strchr(chaine, '\n');
        if (positionEntree != NULL)
        {
            *positionEntree = '\0';
        }
        else
        {
            viderBuffer();
        }
        return 1;
    }
    else
    {
        viderBuffer();
        return 0;
    }
}

double lireDouble()
{
	char texte[100] = {0}, i = 0, *virgule = NULL;

	if(lire(texte, 100))
	{
		virgule = strchr(texte, ',');
		*virgule = '.';
		return strtod(texte, NULL);
	}
	else
		return 0;
}

int main(int argc, char *argv[])
{
    double age = 0;
 
    printf("Quel est votre age ? ");
    age = lireDouble();
    printf("Ah ! Vous avez donc %lf ans !\n\n", age);

	system("PAUSE");
    return 0;
}

La violence est le dernier refuge de l'incompétence : ménager votre ordi! :p
Un programme ne marche pas.. il fonctionne. :p
Un problème sous Blender, référez-vous au Image utilisateur

Sessions photoréalistes du SDZ

Sessions speed modelling du SDZ

 
Hors ligne Qubs # Posté le 12/09/2009 à 16:32:40

Ville : Crolles
Pays : France métropolitaine

Voici ma proposition, qui tiens compte du point et de la virgule :
Code : C
 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
double Read_Double()
 {
     char Text[100] = {0}, *Comma = NULL, *Point = NULL;

     if(Read(Text, 100))
	  {
	      Comma = c_strchr(Text, ',');
	      Point = c_strchr(Text, '.');
	      
	      if(Comma != NULL)
	       {
	           *Comma = '.';
	           return strtod(Text, NULL);
	       }
	       
	      else if(Point != NULL)
	       {
	           *Point = '.';
	           return strtod(Text, NULL);
	       }
	  }  

	 else
	  {
	      return 0;
	  }
 }
Hors ligne Xenons # Posté le 08/10/2009 à 02:08:58
Avatar

Tuto toujours aussi clair M@teo21, rien à redire ;) .
Voici ma petite contribution, un peu différente mais qui reprend le principe, comme la fonction Lire(), de rentrer en paramètres les variables qui vont être affectées.


Code : C
 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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void viderBuffer()
{
    int c = 0;
    while (c != '\n' && c != EOF)
    {
        c = getchar();
    }
}

int lire(char *chaine, int longueur)
{
    char *positionEntree = NULL;
	
    // On lit le texte saisi au clavier
    if (fgets(chaine, longueur, stdin) != NULL)	      // Si la saisie se fait sans erreur
    {
        positionEntree = strchr(chaine, '\n');        // On recherche l'"Entrée"
        if (positionEntree != NULL)                   // Si on a trouvé le retour à la ligne
        {
            *positionEntree = '\0';                   // On remplace ce caractère par \0
        }
        else
        {
            viderBuffer();
        }
        return 1;         // On renvoie 1 si la fonction s'est déroulée sans erreur
    }
    else
    {
        viderBuffer();
        return 0;	  // On renvoie 0 s'il y a eu une erreur
    }
}

//on rentre en paramètres :
// - le pointeur de la variable qui récupère le résultat
// - la longueur de la chaine tolérée pour la saisie (y compris le \0)

int lireLong(long *valeur, int longueur)
{
    //allocation dynamique de la taille du tableau en fonction du paramètre "longueur"
    char *nombreTexte = (char *) malloc(longueur*sizeof(char));
	
    if (lire(nombreTexte, longueur))				// si la fonction lire() a réussi
    {
		*valeur = strtol(nombreTexte, NULL, 10);	// on converti la chaine "nombreTexte" et
				                                // on renvoie le résultat à "valeur"
		
	return 1;   // On renvoie 1 si la fonction lireLong() s'est déroulée sans erreur
    }
    else
    {
        return 0;   // On renvoie 0 s'il y a eu une erreur
    }
}


//on rentre en paramètre :
// - le pointeur de la variable qui récupère le résultat
// - la longueur de la chaine tolérée pour la saisie (y compris le \0)

int lireDouble(double *valeur, int longueur)
{
    //allocation dynamique de la taille du tableau en fonction du paramètre "longueur"
    char *nombreTexte = (char *) malloc(longueur*sizeof(char)), *virgule = NULL;
	
    if (lire(nombreTexte, longueur))				// si la fonction lire() a réussi
    {
		virgule = strchr(nombreTexte, ',');		// on fait pointer le pointeur sur la
								// la première virgule de "nombreTexte",
		*virgule = '.';					// on l'a transforme en '.'
		
		*valeur = strtod(nombreTexte, NULL);		// on convertie "nombreTexte" en double
								// et on affecte le résultat à "valeur"
		free(nombreTexte);				// on libère la place réservée pour le malloc
		
	return 1;   // On renvoie 1 si la fonction lireDouble() s'est déroulée sans erreur
	}
    else
    {
        return 0;   // On renvoie 0 s'il y a eu une erreur
    }
}


P.S : Dans la continuité on pourrait plutôt faire le remplacement de la virgule par le point en recodant la fonction lire() dans la fonction lireDouble().
Mais bon un peu la flème là :-° ...
Et pour ceux qui veulent que le paramètre "longueur" soit la chaîne de caractères réellement récupérés (donc sans le \0), il suffit de remplacer uniquement DANS les accolades des fonctions "longueur" par "(longueur+1)" :) .

« Le savant sait qu'il ignore. » V.H
 
Hors ligne Xenons # Posté le 08/10/2009 à 17:47:16
Avatar

Milles excuses, j'ai codé un peu vite là :D , j'ai oublié pas moins de trois fois de libérer la mémoire allouée avec les malloc(). Bonjour les fuites de mémoire :waw: !!
Il faut corriger dans les 2 fonctions lireLong() et lireDouble() en rajoutant avant chaque "return;" :
Code : C
1
free(nombreTexte);


Voilà je voudrais améliorer les fonctions que j'ai proposées en faisant une "super fonction" globale ^^ . L'idée serait de n'avoir qu'une fonction pour lire une entrée au clavier et dans les paramètres rajouter, comme dans un scanf, soit "%s", "%d" ou "%f" pour définir le type du résultat attendu. Je suis un peu bloqué car je ne sais pas comment je peux gérer un paramètre dont je ne connais pas le type à l'avance, je sais qu'il existe des fonctions qui ont des prototypes de ce genre : int nomFonction (char *format, ...);
Mais j'ai du mal à gérer les paramètres reçus en suite. Je suis preneur pour toutes les explications possibles :ange: . Merci d'avance

« Le savant sait qu'il ignore. » V.H
 
Hors ligne boulzz # Posté le 19/12/2009 à 15:37:46
L'Open Source c'est l'avenir
Avatar

Salut, :)
Euh en lisant, j'ai trouvé une ou deux petites fautes d'orthographe, je sais pas trop où vous les signalez alors je les met là ^^ .
Citation : Tuto
La prochaine fois qu'on appellera scanf, la fonction lira tout seule le mot "Dupont"

Citation : Tuto
On va donc améliorer notre petite fonction lire et appeler si besoin est une sous-fonction viderBuffer

Voilà, peut être que je me trompe, mais je trouve ça bizarre ^^ .
Hors ligne Eti-N # Posté le 10/01/2010 à 18:44:27
ATTENTION! UN BOULET!
Avatar

Ville : Challes-les-eaux
Pays : France métropolitaine

Y a un truc bizarre... J'utilise fgets dans mon code, ça marche et le retour à la ligne automatique ne se fait pas? :waw:

(bon tant mieux pour moi :D )

Vous savez ce qui se passe?

Image utilisateur
Image utilisateur
Image utilisateur

 
Hors ligne Ruby-RHOD # Posté le 25/01/2010 à 17:35:08

La fonction viderBuffer ne voulait pas fonctionner! :colere2:

Et après moultes essais, c'est en changeant '\n' par "\n" que çà fonctionnait o_O .
Petite explication? ^^

(sous visual)
Hors ligne Un # Posté le 09/02/2010 à 20:42:21
Un-1=Zer0
Avatar

Tuto excellent ^^ mais je pense avoir un problème avec
lireDouble();

J'ai trouvé la fonction moi même et tout mais lorsque j'affiche le nombre retourné j'ai un nombre exorbitant o_O
Ensuite j'ai téléchargé la fonction de mateo et toujours le même problème...
Mais bon pas grave, on va dire que c'est un bug :-°


 
Pour accéder à cette section
Connectez-vous !
connexion_rpx