Partage
  • Partager sur Facebook
  • Partager sur Twitter

Importance du caractère "\0"

Sujet résolu
    18 octobre 2019 à 8:37:32

    Bonjour à tous,

    Je cherche à trouver une technique simple qui me permettrait de tester/mettre en valeur l'importance du caractère 0 dans une chaîne de caractères. J'ai essayé quelques exemples mais rien de très flagrant ni de très évident.

    Mon but est par la suite de pouvoir toujours vérifier que mes tableaux de caractères comportent bien le caractère \0 pour les délimiter, et je voudrais également pouvoir démontrer que la fonction read() ne renvoie justement pas ce caractère. 

    Je vous remercie d'avance :) 

    • Partager sur Facebook
    • Partager sur Twitter
      20 octobre 2019 à 15:39:39

      Salut !

      Normalement toutes tes strings finissent par un '\0' tu peux donc créer une variable i que tu incrémente jusqua' '\0' pour connaitre la taille de ta string 

      En espérant t'avoir aidé ! 

      • Partager sur Facebook
      • Partager sur Twitter

      Comprendre, Testez, Rater, Réussir.

        21 octobre 2019 à 4:47:23

        Salut,
        Je ne suis pas certain de comprendre ce que tu veux prouver.
        Comme l'a écrit Croixpizza59, les chaînes sont toujours terminées par un \0 à moins d'avoir généré délibérément un fichier un caractère à la fois et en excluant le \0.
        for)i=0; chaine[i] != \0; i++);
        la valeur de i sera la longueur de ta chaîne.
        Le read() ne lira que ce qui est dans le fichier, sans rien ajouter ou omettre.
        Si tu veux te convaincre que c'est important, parcours ta chaîne jusqu'à ce que tu le trouves et remplaces le par autre chose.
        ensuite, fais un `printf' avec `%s' et tu verras ce que ça donne.
        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          21 octobre 2019 à 9:21:21

          Il me semble que la fonction read lit tous les caractères qu'on lui dit de lire, y compris le caractère 0 s'il existe dans le fichier lu. Le caractère 0 est très souvent présent dans les fichiers non texte (exemple les .exe).
          • Partager sur Facebook
          • Partager sur Twitter

          Le crayon la gomme et le papier sont les meilleurs outils du programmeur !

            21 octobre 2019 à 9:45:42

            En C, on considère comme chaine une suite de caractères commençant à une certaine adresse, et se terminant au premier caractère nul qui suit.

            La fonction read ne s'occupe pas de chaines de caractères, elle lit (elle essaie de lire) un certain nombre d'octets depuis le dispositif indiqué par un descripteur de fichier.  Il peut y avoir des octets nuls, aucun problème.

            Mise en évidence :

            #include <stdio.h>
            #include <unistd.h>
            
            #include <sys/types.h>
            #include <sys/stat.h>
            #include <fcntl.h>
            	
            void save_data_to_file(const char * filename)
            {
            	const char data[] = "un\0deux\0trois";
            	
            	int fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT,
            		S_IRUSR | S_IWUSR);
            	
            	write(fd, data, sizeof(data));
            	close(fd);
            }
            
            	
            void read_data_from_file(const char * filename) {
            	unsigned char buffer[100];
            	int fd = open(filename, O_RDONLY);
            	int nb = read(fd, buffer, 100);
            	for (int i = 0; i < nb; i++) {
            		printf("%02x ", buffer[i]);
            	}
            	printf("\n");
            	close(fd);
            	
            }
            
            int main(int argc, char **argv)
            {
            	save_data_to_file("/tmp/foo");
            	read_data_from_file("/tmp/foo");
            	
            	return 0;
            }
            
            


            Exécution

            75 6e 00 64 65 75 78 00 74 72 6f 69 73 00 
            

            A comparer avec la table du code ASCII en notation hexadécimale

            *              2 3 4 5 6 7     
                         -------------      
                        0:   0 @ P ` p   
                        1: ! 1 A Q a q  
                        2: " 2 B R b r   
                        3: # 3 C S c s   
                        4: $ 4 D T d t  
                        5: % 5 E U e u  
                        6: & 6 F V f v   
                        7: ´ 7 G W g w   
                        8: ( 8 H X h x    
                        9: ) 9 I Y i y    
                        A: * : J Z j z
                        B: + ; K [ k {
                        C: , < L \ l |
                        D: - = M ] m }
                        E: . > N ^ n ~
                        F: / ? O _ o SUP
            




            -
            Edité par michelbillaud 23 octobre 2019 à 11:49:06

            • Partager sur Facebook
            • Partager sur Twitter
              23 octobre 2019 à 11:41:49

              Merci à tous pour vous retours, c'est bien plus clair ! :) 

              • Partager sur Facebook
              • Partager sur Twitter

              Importance du caractère "\0"

              × 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