Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide sur strlen ou autre

    23 octobre 2008 à 21:35:09

    Bonjour je travail en ce moment sur les tableaux et je cherche à compter les caractères dans le tableau pour trouver ou ce trouve exactement le \0

    Je vous explique le déroulement du programme:
    1-Via un gets je prend une chaine de caractères
    2-Je bascule cette chaine dans un deuxième tableau en faisant un décalage d'une case

    Et je cherche à trouver ou se trouve le \0 dans mon premier tableau donc si quelqun peut m'éclaircir sur le strlen ou autre ???

    merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      23 octobre 2008 à 21:53:59

      Si j'ai bien compris, tu cherches à recréer strlen ?

      Citation : ProgZ

      1-Via un gets je prend une chaine de caractères


      Ca, c'est bon (quoiqu'il faudrait préférer fgets à gets).

      Citation : ProgZ

      2-Je bascule cette chaine dans un deuxième tableau en faisant un décalage d'une case


      Là, je ne comprends plus. Qu'entends-tu par basculer ? Et ton décalage, il est dans quel sens ?


      A+
      • Partager sur Facebook
      • Partager sur Twitter
        23 octobre 2008 à 22:00:14

        Salut progZ,

        Tu veux trouver le caractère '\0' dans une chaîne, pourquoi te compliquer la vie ? Tu parcours simplement la chaîne de caractères à l'aide d'une boucle for à partir de l'indice 0 et tu stoppes la boucle dés que tu as trouvé '\0', donc dés que chaîne[i]=='\0' (i, c'est la variable de boucle du for). À partir de là, tu renvois i et hop, c'est la taille de la chaîne.

        À toi de jouer ! :)
        • Partager sur Facebook
        • Partager sur Twitter
          23 octobre 2008 à 22:36:35

          Citation : royalbru

          Si j'ai bien compris, tu cherches à recréer strlen ?

          Citation : ProgZ

          1-Via un gets je prend une chaine de caractères


          Ca, c'est bon (quoiqu'il faudrait préférer fgets à gets).

          Citation : ProgZ

          2-Je bascule cette chaine dans un deuxième tableau en faisant un décalage d'une case


          Là, je ne comprends plus. Qu'entends-tu par basculer ? Et ton décalage, il est dans quel sens ?


          A+



          Donc enfait je copie les caractères du gets dans un nouveau tableau avec un indice+1 pour décalé ver la droite donc commencer à écrire dans le nouveau tableau dés la deuxieme case.

          Puis je dois trouver exactement ou est le \0 pour le remplacé par un caractére dans mon nouveau tableau

          Exemple:                                0 1 2 3 4 5 6 7
          dans gets j'ai                          V I V E L E C \0
          
          dans mon nouveau tableau je veux        0  1  2  3  4  5  6  7  8
                                                  x  V  I  V  E  L  E  C  x
          


          Donc faire le décalage c'est facile après je lui dit de mettre x dans ma premiere case
          par contre je voudrais identifier mon \0 dans gets pour dire de mettre x dans le nouveau tableau.

          Le souci c'est que je ne connais pas le nombre de caractere de gets qui peut etre de 16 au maximum.
          • Partager sur Facebook
          • Partager sur Twitter
            23 octobre 2008 à 23:08:50

            Bonjour, j'ai absolument rien compris de ton problème.

            strlen te renvoie la longueur de la chaine qui est par la même occasion l'index de '\0'.

            Ca veut dire quoi "identifier mon \0 dans gets ?". gets c'est une fonction, y a pas de \0 dedans. Dans la chaine que tu récupères avec gets il y en a un, que tu peux trouver très facilement lorsque tu la parcours en comparant chaine[i] et '\0' (si c'est égal: tu l'as trouvé, sinon il est plus loin).

            Et j'espère qu'en utilisant gets tu es conscient de ça:

            Citation


            N'utilisez jamais gets(). Comme il est impossible de savoir à l'avance combien de caractères seront lus par gets(), et comme celui-ci écrira tous les caractères lus, même s'ils débordent du tampon, cette fonction est extrèmement dangereuse à utiliser. On a déjà utilisé ce dysfonctionnement pour créer des trous de sécurité. UTILISEZ TOUJOURS fgets() À LA PLACE DE gets().

            • Partager sur Facebook
            • Partager sur Twitter
              23 octobre 2008 à 23:28:16

              Oui dsl je me suis mal éxprimé je veux trouver le \0 qui se trouve dans la chaine récupéré avec mon gets.

              voici mon code:
              /* Inclusion de bibliothèques du C */
              
              #include "stdafx.h"
              #include <stdio.h>
              #include <string.h>
              
              
              int main(int argc, char* argv[])
              {
              	/* Declaration de mes tableaux et variable */
              	char tableauFinal[3][19];
              	char		temp[19];
              	short int	indice=0;
              	
              	for (indice=0;indice<3;indice++)
              	{
              		printf("\n Entrez la ligne %d:",indice+1);
              		gets(temp);
              
              		switch (indice)
              		{
              			case 0:
              
              					do
              					{
              					    /* Création de mon décalge et récupération des caractères dans gets vers tableauFinal */
              						tableauFinal[0][indice+1]=temp[indice];
              						indice ++;
              
              					}	while (indice<20 || temp[indice]==0);
              						tableauFinal[0][0]=0x01;
              						printf ("%s",tableauFinal[0]);
              						indice=0;
              						break;
              			case 1:
              					indice=0;
              					do
              					{ /* Création de mon décalge et récupération des caractères dans gets vers tableauFinal */
              						tableauFinal[1][indice+1]=temp[indice];		
              						indice ++;
              
              					}	while (indice<20 || temp[indice]==0);
              						tableauFinal[1][0]=0x02;
              						printf ("%s",tableauFinal[1]);
              						indice=1;
              						break;
              
              			case 2: 
              					indice=0;
              					do
              					{ /* Création de mon décalge et récupération des caractères dans gets vers tableauFinal */
              						tableauFinal[2][indice+1]=temp[indice];
              						indice ++;
              
              					}	while (indice<20 || temp[indice]==0);
              						tableauFinal[2][0]=0x03;
              						printf ("%s",tableauFinal[2]);
              						indice=2;
              
              						break;
              
              			default :
              						printf ("\n DSL erreur ");
              		}
              	}
              	
              	return 0;
              	
              }
              


              Donc dans chaque case je récupere les caractères de la chaine de gets vers tableau final avec un décalage pour mettre le code 0x01 dans la case vide du début
              et enfait je voudrai trouver le \0 de ma chaine récupéré avec mon gets pour pouvoir mettre dans tableauFinal le code 0x0D a la place
              Sachant que au départ je sais pas combien de caractères fera ma chaine dans gets
              • Partager sur Facebook
              • Partager sur Twitter
                23 octobre 2008 à 23:49:41

                Oula... tu crois pas qu'il est possible de factoriser tout ça, plutot que d'avoir 3 fois le même code et utiliser des 0 partout dans case 0, des 1 dans case 1 et des 2 dans case 2 ? (Surtout si c'est pour avoir une boucle qui ne parcours jamais le même code... enfin bref c'est pas le sujet)

                A part ça...

                do
                {
                	/* Création de mon décalge et récupération des caractères dans gets vers tableauFinal */
                	tableauFinal[0][indice+1]=temp[indice];
                	indice ++;
                
                }while (indice<20 || temp[indice]==0);
                tableauFinal[0][0]=0x01;
                printf ("%s",tableauFinal[0]);
                indice=0;
                break;
                


                Tu parcours ta chaine en faisant varier indice qui demarre à 0 et qui s'arrête à 20.
                Au passage, tes chaines font toutes 19 caractères. Donc lorsque indice = 19, tu tapes dans temp[19] et tableauFinal[0][20] (et tableauFinal[0][19] lorsque indice=18) qui ne t'appartiennent pas. Il va falloir revoir la définition des tableaux.

                Puisque tu fais des décalages sur des chaines de 19 caractères, j'imagine que la chaine d'entrée est supposée faire moins... donc temp contient <ta chaine> + '\0' + <du déchet>.
                Donc au lieu de boucler sur la totalité des cases disponibles et recopier également le déchet, autant t'arrêter dès que tu tombes sur '\0'. C'est beaucoup plus efficace, et en sortie de boucle tu auras l'indice de '\0'.
                • Partager sur Facebook
                • Partager sur Twitter
                  23 octobre 2008 à 23:52:55

                  }	while (indice<20 || temp[indice]==0);
                  

                  ce serait pas plutôt :
                  }	while (indice<20 && temp[indice]!=0);
                  

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 octobre 2008 à 23:54:55

                    Oui mais pour j'arrive pas à stopper au \0 mon while continu même quand il trouve le \0


                    Mais Avec la réctification de joccd je sort bien de mon while des que je rencontre le \0 :D:D Merci et merci mcyrb pour la définition de tableau car j'avais vraiment pas vu.

                    Bon maintenant que je sort de ma boucle il faut juste que j'arrive a dire que mon \0 se transforme en 0x0D dans mon tableau final :o
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 octobre 2008 à 0:11:26

                      Lorsque tu detecte '\0' dans temp tu met 'x' dans final et tu casse ta boucle (le '\0' se met tout seul à la fin de la chai^ne contenu dans final), c'est tout.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 octobre 2008 à 0:16:11

                        Je ne veux pas \0 dans final mais 0x0D qui correspond a un code ASCII

                        Mais enfait j'ai un autre probleme maintenant c'est que a chaque case je re ecrit sur des ligne précédente du tableau :colere2:o_O
                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 octobre 2008 à 0:21:16

                          Citation : ProgZ

                          Je ne veux pas 0 dans final mais 0x0D qui correspond a un code ASCII



                          Va quand même en falloir un, puisque tu écris
                          printf ("%s",tableauFinal[0]);
                          


                          Et la doc de printf pour le format %s dit:

                          Citation

                          S'il n'y a pas de modificateur l, l'argument de type const char * est supposé être un pointeur sur un tableau de caractères (pointeur sur une chaîne). Les caractères du tableau sont écrits jusqu'au caractère NUL final, non compris. Si une précision est indiquée, seul ce nombre de caractères sont écrits. Si une précision est fournie, il n'y a pas besoin de caractère nul. Si la précision n'est pas donnée, ou si elle est supérieure à la longueur de la chaîne, le caractère NUL final est nécessaire.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 octobre 2008 à 0:25:13

                            Oui mais le printf est juste un test pour voir si cela s'affiche correctement enfait dans mon tableauFinal je veux par exemple

                            0   1   2   3   4    5    
                            0x01  T   E   S   T  0x0D
                            


                            Car si je programme ce code c'est pour essayé de l'envoyer sur un emulateur d'afficheur à LED et il faut impérativement que la chaine commence par 0x01 ou 0x02 ou 0x03 pour affecter la ligne de l'afficheur puis ensuite finir par 0x0D pour la fin de phrase.

                            Donc c'est pour cela que je prend ma chaine dans temp
                            et je la renvoi sous cette forme dans tableau final

                            Je rapelle la forme 0x01 <16 caracteres max> 0x0D
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 octobre 2008 à 0:27:42

                              Citation : ProgZ

                              Je ne veux pas 0 dans final mais 0x0D qui correspond a un code ASCII



                              0 et \0 c'est pas du tout la même chose...

                              Ce que j'ai dit est correcte, mais tu n'as pas compris à ce que je vois. Remplace 'x' dans ce que j'ai dit par 0x0D, et c'est la même chose.

                              EDIT :

                              En fait, en simple le principe c'est ça :

                              il est vrai que l'utilisation de break ici n'etait pas propre du tout.

                              char final[21];
                              char temp[19];
                              
                              int i;
                              
                              .
                              .
                              .
                              
                              final[0] = 0x01;
                              
                              while(temp[i] != '\0')
                              {
                                 final[i+1] = temp[i];
                                 i++;
                              }
                              
                              final[i+1] = 0x0D;
                              
                              ...
                              


                              C'est plus propre ainsi.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 octobre 2008 à 0:34:23

                                A ok je comprend mieux dsl.
                                Mais par contre je ne vois pas du tout comment le coder :o

                                Je vais le mettre en pratique dessuite
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  24 octobre 2008 à 0:36:33

                                  Citation : T-S-L

                                  0 et \0 c'est pas du tout la même chose...


                                  et depuis quand ?
                                  et ton code est supra moche (utiliser break juste pour pas utiliser de && ...):p
                                  il lui suffit de rajouter a la sortie de la boucle :
                                  tableauFinal[0][indice+1]=0x0D;
                                  
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    24 octobre 2008 à 0:40:38

                                    Citation : joccd

                                    Citation : T-S-L

                                    0 et \0 c'est pas du tout la même chose...


                                    et depuis quand ?



                                    Je suis désolé mais le caractère '0' et '\0' ce n'est pas la même chose.
                                    Tu confonds, \0 vaut 0x00 donc 0 en décimal.

                                    Je rajouterais que mon code est vite fait, c'est juste pour présenté le principe... et puis je vois pas pourquoi tu me parle de &&.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      24 octobre 2008 à 0:46:39

                                      malentendu, je pensais que vous parliez des valeurs ASCII :D
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        24 octobre 2008 à 0:50:16

                                        J'ai tester ton code TSL mais il n'aime pas trop les = quand je compile

                                        /* Inclusion de bibliothèques du C */
                                        
                                        #include "stdafx.h"
                                        #include <stdio.h>
                                        #include <string.h>
                                        
                                        
                                        int main(int argc, char* argv[])
                                        {
                                        	/* Declaration de mes tableaux et variable */
                                        	char tableauFinal[3][21];
                                        	char		temp[19];
                                        	int			indice=0;
                                        	
                                        	for (indice=0;indice<3;indice++)
                                        	{
                                        		printf("\n Entrez la ligne %d:",indice+1);
                                        		gets(temp);
                                        
                                        		switch (indice)
                                        		{
                                        			case 0:
                                        
                                        					tableauFinal[0][0]=0x01;
                                        
                                        						for(indice=0; indice<19; indice++)
                                        						{
                                        							{
                                        								if(temp[indice] = '\0')
                                        							{	
                                             
                                        							tableauFinal[indice+1]=0x0D;
                                        							break;
                                        
                                        							tableauFinal[indice+1]=temp[indice];
                                        						}
                                        							break;
                                        
                                        		
                                        			default :
                                        						printf ("\n DSL erreur ");
                                        						break;
                                        		}
                                        	}
                                        	
                                        	return 0;
                                        	
                                        }
                                        
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          24 octobre 2008 à 0:53:29

                                          Citation : ProgZ

                                          if(temp[indice] = '\0')
                                          

                                          tu m'étonnes ...
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            24 octobre 2008 à 0:53:53

                                            Le code que je t'ai présenté c'est juste un exemple, faut que tu adapte à ton code ensuite.
                                            Et c'est pas "if(temp[indice] = '\0')" mais "if(temp[indice] == '\0')"

                                            EDIT : grillé ^^

                                            EDIT2 : J'ai repris ton code un peu, là ça marche

                                            #include <stdio.h>
                                            #include <string.h>
                                            
                                            
                                            int main(int argc, char* argv[])
                                            {
                                               /* Declaration de mes tableaux et variable */
                                               char tableauFinal[0][21];
                                               char temp[19];
                                               int indice=0;
                                            
                                            
                                               printf("\n Entrez la ligne %d:",indice+1);
                                               gets(temp);
                                            
                                               switch (indice)
                                               {
                                            	case 0:
                                            	   tableauFinal[0][0]=0x01;
                                            
                                            	   for(indice=0; indice<19; indice++)
                                            	   {
                                                          if(temp[indice] == '\0')
                                            	      {
                                            
                                            		tableauFinal[0][indice+1]=0x0D;
                                            		break;
                                            	      }
                                            
                                            	      tableauFinal[0][indice+1]=temp[indice];
                                            	    }
                                            	    break;
                                            
                                            
                                            	default :
                                            	    printf ("\n DSL erreur ");
                                            	    break;
                                               }
                                            
                                            return 0;
                                            
                                            }
                                            


                                            Nota Bene : le switch ne sert plus à rien, mais je l'ai laissé quand meme au cas ou tu voudrais comme dans ton code de depart.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              24 octobre 2008 à 0:57:16

                                              Mais le problème a la compile c'est.

                                              tableauFinal[indice+1]=0x0D;

                                              tableauFinal[indice+1]=temp[indice];

                                              error C2440: '=' : cannot convert from 'const int' to 'char [19]'
                                              There are no conversions to array types, although there are conversions to references or pointers to arrays

                                              : error C2440: '=' : cannot convert from 'char' to 'char [19]'
                                              There are no conversions to array types, although there are conversions to references or pointers to arrays

                                              Probleme resolu en ajoutant la ligne de mon tableau

                                              Mais il me reste une erreur
                                              fatal error C1004: unexpected end of file found
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                24 octobre 2008 à 0:59:52

                                                Citation : ProgZ

                                                tableauFinal[indice+1]=0x0D;
                                                


                                                manque peut être quelque chose entre tableauFinal et [indice+1]
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  24 octobre 2008 à 1:01:36

                                                  Oui j'avais vu merci ;)
                                                  loool je devrai mieu me coucher mdr :lol:
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    24 octobre 2008 à 1:02:13

                                                    Je ne sais pas quel IDE tu utilises mais tu devrais réduire la taille des alinéas parce que ton indentation est difficilement lisible.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      24 octobre 2008 à 1:03:40

                                                      Visual
                                                      Mais il y a que sur FireFox sur ça indente de cette taille
                                                      Sur visual c'est normal :o
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        24 octobre 2008 à 1:07:53

                                                        Sinon n'oublie pas de sécurisé l'entrée de la chaîne par l'utilisateur, histoire de ne pas avoir de problème de buffer overflow. Faut restreindre la chaîne entrée à 18 caractères et pas un de plus.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          24 octobre 2008 à 1:10:33

                                                          Oui mais je peux le faire par la suite deja j'essaye de trouver pourquoi j'ai une erreur

                                                          fatal error C1004: unexpected end of file found

                                                          Pour pourvoir tester ton code
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            24 octobre 2008 à 1:14:21

                                                            Regarde plus haut, j'ai refait ton code. Le unexpected end of file c'etait dù à que tu avais oublié 1 ou 2 accolades.
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              24 octobre 2008 à 1:17:52

                                                              Oui merci

                                                              enfait je viens de les trouvés a 1h15 du mat c'est pas bon pour prog :lol:
                                                              Bon merci ça à l'aire de marcher cette boucle je part la dessus et je te tiens au courant par MP pour voir si j'arrive a faire mes trois lignes

                                                              Merci a tous bonne nuit je vous tiendrai au courant
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Aide sur strlen ou autre

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown