remise a zero d'un tableau ?

remise a zero d'un tableau ? - C - Programmation

Marsh Posté le 30-12-2004 à 18:48:18    

Salut,
 
Comment puis je remettre mon tableau a zero ?
doi-je passer par une boucle obligatoirement?
les 2 tableau que je ve remettre a zero,je les ai déclarer ainsi:
 
char tab2[60]={0};
char tab3[60]={0};
 
svp, merci

Reply

Marsh Posté le 30-12-2004 à 18:48:18   

Reply

Marsh Posté le 30-12-2004 à 18:49:57    

Daniel59 a écrit :


Comment puis je remettre mon tableau a zero ?
doi-je passer par une boucle obligatoirement?
les 2 tableau que je ve remettre a zero,je les ai déclarer ainsi:


char tab2[60]={0};
char tab3[60]={0};




La boucle est une solution, sinon memset() fonctionne aussi.


Message édité par Emmanuel Delahaye le 30-12-2004 à 18:50:29

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-12-2004 à 19:01:57    

Ou bzero(), au choix. La boucle est une moins bonne solution.
 
Edit : j'avais jamais remarque mais comme l'a dit Emmanuel bzero n'est pas standard, et en plus c'est deprecie. Donc memset().


Message édité par matafan le 30-12-2004 à 19:31:45
Reply

Marsh Posté le 30-12-2004 à 19:09:26    

G opté pour le memset:
 
memset(tab2, '\0', strlen(tab2) - 1);
memset(tab3, '\0', strlen(tab3) - 1);
 
seul bleme, si le tableau est deja a zero ça plante, je l'é mi en fin de mon while avec une condition!
 
matafan keske le bzero(), c'est une fonction ke je doi creer tu ve dire? parce que yé pas dans mon index.

Reply

Marsh Posté le 30-12-2004 à 19:17:04    

Bon alors plusieurs remarques la :
 
1) memset prend un int, pas un char. Donc met simplement 0 au lieu de '\0'
 
2) Si ton tab2[0] == 0 alors strlen te renvoit 0. Et passer -1 a memset, ca lui fait mettre a 0 les 4294967295 octets qui suivent tab2.
 
3) J'ai l'impression que tu traites tes tableau comme des chaines. Si c'est le cas et si tu veux simplement mettre une chaine vide dans ton tableau, pas besoin de memset ou bzero : tab2[0] = '\0' suffit.
 
PS : bzero c'est un fonction de la libc tout comme memset, et elle est declaree dans strings.h tout comme memset.


Message édité par matafan le 30-12-2004 à 19:18:07
Reply

Marsh Posté le 30-12-2004 à 19:24:24    

matafan a écrit :

Ou bzero(), au choix. La boucle est une moins bonne solution.


bzero() n'est pas standard.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-12-2004 à 19:28:32    

Daniel59 a écrit :

G opté pour le memset:


memset(tab2, '\0', strlen(tab2) - 1);
memset(tab3, '\0', strlen(tab3) - 1);




Non!


#include <string.h>
<...>
memset(tab2, 0, sizeof tab2);
memset(tab3, 0, sizeof tab3);


Mais si ces tableaux sont utilisés dans le contexte 'chaine de caractères', la méthode simple et rapide de créer une chaine vide est


*tab2 = 0;
*tab3 = 0;


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-12-2004 à 19:32:21    

matafan a écrit :


1) memset prend un int, pas un char. Donc met simplement 0 au lieu de '\0'


C'est pareil. Un caractère littéral est un int en C.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-12-2004 à 20:11:44    

Bon, euh bah
tab2[0] = '\0'; ou *tab2 = 0; ça marche po
soit mon prog plante, soit c mon editeur ki se fé totalment jette par XP, lol!
un pe d'aide sur la fonction de mon prog vous aidera surement:
http://www.chez.com/pyro2000/help/mdp.txt

Reply

Marsh Posté le 30-12-2004 à 20:39:53    

Daniel59 a écrit :

Bon, euh bah
tab2[0] = '\0'; ou *tab2 = 0; ça marche po
soit mon prog plante, soit c mon editeur ki se fé totalment jette par XP, lol!
un pe d'aide sur la fonction de mon prog vous aidera surement:
http://www.chez.com/pyro2000/help/mdp.txt


 

Citation :


int controleacces(void)
{
FILE *fp;
char login[30];
char mdp[20];
char separ=',';
char tab[60]={0};
char tab2[60]={0};
char tab3[60]={0};
char car;
int i=0,j=0,k=0,l=0,ptr=1;
//int retour=0;
 
puts("Entrer votre login :" );
scanf("%s", login);
     
puts("Entrer votre mdp :" );
scanf("%s", mdp);


Trou de sécurité (pour un login/mdp, c'est intéressant...)
 
Pour saisir une ligne, il vaut mieux utiliser fgets(). Détails ici:
 
http://mapage.noos.fr/emdel/notes.htm#saisie

Citation :


fp=fopen(LINK,"a+" );


Pourquoi "a+" et non "a" ? C'est un truc à casser un fichier...
 
Le reste parait extrèmement complexe pour une simple vérification de login/mot de passe...
 
Dans le fichier :  
 
login<espace>mot-de-passe
 
Lire ce fichier :  
 
fgets()
sscanf() avec "%s %s""
 
comparaison : strcmp() dès qu'on a le login, on vérifie le mdp...
 
rien de compliqué.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-12-2004 à 20:39:53   

Reply

Marsh Posté le 30-12-2004 à 20:56:27    

Arf, justement c plu compliké ke ça, et je ve bien suivre le cahier des charges.
Le fichier texte se compose ainsi:
nom,mdp,etat(utilisateur ou superutilisateur)
 
la fonction compare donc nom et mot de passe et aprés retournera 1 si c un utilisateur et 2 si c un superutilisateur, mais ça g pas encore fé!
et il est vrai ke l'histoire de virgule pe etre dur a comprendre mais ça marche!
sinon pour remettre les tablo a zero je reste sur mes memset de départ qui fonctionne bien

Reply

Marsh Posté le 30-12-2004 à 22:07:03    

Bon il n'y a plu de rapport avec le sujet, mais bon maintenant ke t'a vu ma fonction
Je ve utilisé un feof pour detecter la fin du fichier, mais il me retourne tjrs 0!
 
help, merci
g mi a jour le txt du lien plu haut.

Reply

Marsh Posté le 30-12-2004 à 22:29:28    

Daniel59 a écrit :

Bon il n'y a plu de rapport avec le sujet, mais bon maintenant ke t'a vu ma fonction
Je ve utilisé un feof pour detecter la fin du fichier, mais il me retourne tjrs 0!


Pourquoi  feof()? Qui t'as dit d'utiliser cette fonction ? Encore un prof à la masse ?
 
Pour déterminer si la lecture a été interrompue, il faut utiliser le code retourné par la fonction de lecture
 
fgets() -> NULL
fgetc() -> EOF


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-12-2004 à 22:30:52    

Emmanuel Delahaye a écrit :

Pourquoi  feof()? Qui t'as dit d'utiliser cette fonction ? Encore un prof à la masse ?
 
Pour déterminer si la lecture a été interrompue, il faut utiliser le code retourné par la fonction de lecture
 
fgets() -> NULL
fgetc() -> EOF


 
Au fait dans ton code, tu n'as rien corrigé. Je vois toujours des scanf(). (à moins que mon cache me joue des tours...)
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-12-2004 à 22:56:42    

Laisser mon prof la ou il est, chui seul devant mon ecran, ya pas de prof!
 
Et puis keski ont mes scanf ?? de toute façon de ce coté g pas fini puisque des etoiles devront apparaitre pour le mot de passe.
Mais il fonctionne pour l'instant!
 
Sinon bah v voir pour fonction de lecture, va falloir changé un pe.
merci

Reply

Marsh Posté le 30-12-2004 à 23:11:45    

Voila donc ça marche, des do-while arrange l'affaire.(txt mi a jour)
Maintenant je doi mettre des etoile kan on tape le mot de passe...

Reply

Marsh Posté le 30-12-2004 à 23:12:16    

[:benou] scanf çà pue, utilise fgets ou getline (GNU) puis sscanf. Il te suffit de chercher un peu sur le net et psssst le C n'est pas fiable si tu ne vérifies pas le bonne usage de tes fonctions, tu as donc intéret à te renseigner un minimum (net, page de man, bouquins...) si tu veux t'y mettre sérieusement.
Pour le mot de passe je t'aurais bien conseillé getpass (sans etoile) mais c'est considéré comme obsoléte...


Message édité par manatane le 30-12-2004 à 23:12:47
Reply

Marsh Posté le 30-12-2004 à 23:24:03    

Il n'y a pas de contrôle lorsque tu parcours les tableaux dans tes boucles "do ... while".
 

Code :
  1. do
  2. {
  3. car = fgetc(fp);
  4. tab2[i]=car;
  5. if(car!=',')
  6.   {j++;}
  7. else if(k==0)
  8.   {k++;j++;}
  9. i++;
  10. }while(i==j && car!=EOF);


 
Tu pourrais définir une constante ("MAX_TAILLE_..." ) et l'utiliser à la fois pour définir tes tableaux et ajouter un contrôle dans tes boucles.


Message édité par darkoli le 30-12-2004 à 23:25:28

---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed