[C]Que signifit cette erreur à la compilation

Bonjour,

à la compilation d'un programme, j'ai obtenu ce message d'erreur:

erreur: stray ‘\160’ in program


Qu'est-ce que ça signifit ?

Merci

17 réponses

  1. Contributeur
    Colle ton programme ici ce sera plus simple.
    0
    1. Salut,

      voici ce que j'obtiens à la compilation
      parse_trace.c:10: erreur: stray ‘\160’ in program
      parse_trace.c:10: erreur: stray ‘\160’ in program
      


      La ligne 10 est celle que j'ai mis en gras.
      Je voudrais également savoir si mon programme est bien écrit et à quel moment, il me faut faire des free pour libérer la mémoire.

      Merci

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <assert.h>
      
      #define F "fichier"
      
      
      typedef struct{
        u_char ip[4];   
      }t_ip;
      
      
      typedef struct{
        t_ip *tabIP;// Tableau des IP
        size_t nbIP;// Nb d'IP
        size_t sizeIP;// Taille allouée à "tabIP"
      }t_route;
      
      
      static void purge(FILE *fp)
      {
        int c;
        while ((c = fgetc(fp)) != '\n' && c != EOF)
          {
          }
      }
      
      static void clean (char *s, FILE *fp)
      {
        char *p = strchr (s, '\n');
        if (p != NULL)
          {
            *p = 0;
          }
        else
          {
            purge (fp);
          }
      }
      
      
      int main()
      {
        FILE *fp = fopen(F, "r");
        int **tab;
        int i=0;
        t_route trace;
        trace.tabIP = NULL;
        trace.nbIP = 0;
        trace.sizeIP = 0;
        int j = 0;
        
        /*trace = malloc(size * sizeof(Adresse_ip));
        if(tab_ip == NULL){
          perror("erreur allocation");
          exit(1);
          }*/
        
        if (fp != NULL)
          {
            char line[BUFSIZ];
            
            while (fgets(line, sizeof line, fp) != NULL)
      	{
      	  clean(line, fp);
      	  
      	  char *p = strtok(line, " ");
      	  if (p != NULL)
      	    {
      	      p = strtok(NULL, " ");
      	      if (p != NULL)
      		{
      		  if(trace.nbIP == trace.sizeIP)
      		    {
      		      trace.sizeIP += 1;
      		      
      		      trace.tabIP = realloc(trace.tabIP, (trace.sizeIP) * sizeof(*trace.tabIP));
      		      if (trace.tabIP == NULL)
      			{
      			  perror("erreur allocation");
      			  exit(1);
      			}
      		    }
      		  
      		  char ip[4];
      		  sscanf(p, "%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3);
      		  
      		  trace.tabIP[trace.nbIP].ip[0] = ip[0];   
      		  trace.tabIP[trace.nbIP].ip[1] = ip[1];
      		  trace.tabIP[trace.nbIP].ip[2] = ip[2];
      		  trace.tabIP[trace.nbIP].ip[3] = ip[3];
      		  
      		  trace.nbIP++;  
      		  
      		}  
      	      else
      		{
      		  printf ("format error\n");
      		  break;
      		}
      	    }
      	  else
      	    {
      	      printf ("format error\n");
      	      break;
      	    }
      	}
            fclose (fp), fp = NULL;
          }
        else
          {
            perror (F);
          }
        
        for(j=0; j<trace.sizeIP; j++)
          {
            printf("%d.%d.%d.%d ",trace.tabIP[j].ip[0],trace.tabIP[j].ip[1],
      	     trace.tabIP[j].ip[2],trace.tabIP[j].ip[3]);
            printf("\n");
          }
        
        return 0;
      }
      
      
      0
      1. Contributeur
        le u_char est apparement pas un type qui existe toujours est til que mon compilo l'aime pas.

        la de suite j'ai pas trop le temps de regarder mais je fais ca ce soir en rentrant.
        0
        1. Modérateur
          Je pense que c'est plutôt uchar, non ? Tu peux aussi écrire unsigned char ou encore définir un type personnalisé :
          typedef unsigned char u_char;


          Bonne chance
          0
          1. Salut,

            j'ai essayé les 2 façons que tu proposes mais il y a toujours le même message d'erreur
            0
            1. Modérateur
              Le message d'erreur s'il te plait... Essaye de mettre juste char sinon.
              0
              1. Même avec uniquement char ip[4], j'obtiens ce message:

                parse_trace.c:10: erreur: stray ‘\160’ in program
                parse_trace.c:10: erreur: stray ‘\160’ in program
                
                0
                1. Modérateur
                  Zut je suis pas sous linux mais en fait je commence a me demander si tu n'as pas des caractères foireux, typiquement ce qui arrive quand tu compiles un fichier windowsien sous linux... En général on s'en sort avec un dos2unix... Mais si ça se trouve ça n'a rien à voir....
                  dos2unix lefichier

                  Bonne chance
                  0
                  1. Modérateur
                    Salut,

                    je ne me suis pas posé la question concernant ton code mais j'ai essayé de le compile sur un FC4 et voilà le résultat de la compilation

                    [lamitest@localhost trash]$ uname -a
                    Linux localhost 2.6.16-1.2108_FC4 #1 Thu May 4 23:52:01 EDT 2006 i686 athlon i386 GNU/Linux
                    [lamitest@localhost trash]$ gcc --version
                    gcc (GCC) 4.0.2 20051125 (Red Hat 4.0.2-8)
                    Copyright © 2005 Free Software Foundation, Inc.
                    Ce logiciel est libre; voir les sources pour les conditions de copie.  Il n'y a PAS
                    GARANTIE; ni implicite pour le MARCHANDAGE ou pour un BUT PARTICULIER.
                    
                    [lamitest@localhost trash]$ gcc -o krilin krilin.c
                    [lamitest@localhost trash]$ file krilin
                    krilin: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
                    [lamitest@localhost trash]$
                    
                    
                    lami20j
                    0
                    1. Bonjour,

                      est-ce que quelqu'un a une idée car l'erreur persiste?

                      Merci
                      0
                      1. Modérateur
                        Tu es sous linux ? Si oui as tu fais un dos2unix sur chacun de tes fichiers ?
                        dos2unix *cpp

                        Car si ton fichier est écrit en mode dos, tu as parfois ce genre d'erreur...

                        Bonne chance
                        0
                        1. Salut,

                          alors j'ai effacé la structure qui me causait une erreur et je l'ai réécrite, le problème a disparu.

                          Maintenant j'obtiens une erreur de segmentation à l'execution.

                          ESt-ce que quelqu'un voit dans mon code ou ça pourrait causer cette erreur ?

                          Merci
                          0
                          1. Modérateur
                            Si le problème s'est résolu après réecriture, c'était probablement dû comme je le soupçonnais à des caractères bizarres (invisibles dans ton éditeur) qui faisait planter le compilateur.

                            Si tu utilises gcc, compile avec l'option -g, et lance gdb :
                            gcc -W -Wall -g -o plop.exe plop.c
                            gdb plop.exe

                            Une fois dans gdb, lance le programme pour le faire planter, et affiche la pile d'exécution :
                            r
                            bt

                            puis copie-colle le résultat ici. Tu auras la ligne exacte du plantage.

                            Si tu ne t'en sors pas, essaye avec un autre debugger (par exemple ddd est un debugger graphique peut être plus intuitif que gdb). Pense à nous donner la dernière version du code (à moins qu'elle n'ait pas évolué depuis le post <2>)

                            Bonne chance
                            0
                            1. Salut,

                              j'obtiens ceci :
                              Program received signal SIGSEGV, Segmentation fault.
                              0x080487b3 in main () at parse_trace.c:67
                              67                        trace.tabIP[trace.nbIP].ip[0] = ip[0];


                              Avec le programme suivant :

                              #include <stdio.h>
                              #include <stdlib.h>
                              #include <string.h>
                              #include <assert.h>
                              
                              #define F "fichier"
                              
                              typedef struct{
                                unsigned char ip[4];
                              }t_ip;
                              
                              typedef struct{
                                t_ip *tabIP;
                                size_t nbIP;
                                size_t sizeIP;
                              }t_route;
                              
                              static void purge(FILE *fp){
                                int c;
                                while((c = fgetc(fp)) != '\n' && c != EOF){}
                              }
                              
                              static void clean(char *s, FILE *fp){
                                char *p = strchr(s, '\n');
                                if(p != NULL){
                                  *p = 0;
                                }
                                else{
                                  purge(fp);
                                }
                              }
                              
                              int main(){
                                FILE *fp = fopen(F, "r");
                                t_route trace;
                                trace.tabIP = NULL;
                                trace.nbIP = 0;
                                trace.sizeIP = 0;
                                int j = 0;
                                
                                if (fp != NULL)
                                  {
                                    char line[BUFSIZ];
                                    while (fgets(line, sizeof line, fp) != NULL)
                              	{
                              	  clean(line, fp);char *p = strtok(line, " ");
                              	  if (p != NULL)
                              	    {
                              	      p = strtok(NULL, " ");
                              	      if (p != NULL)
                              		{
                              		  if(trace.nbIP == trace.sizeIP)
                              		    {
                              		      trace.sizeIP += 1;
                              		      
                              		      trace.tabIP = realloc(trace.tabIP, (trace.sizeIP) * sizeof(*trace.tabIP));
                              		      if (trace.tabIP == NULL)
                              			{
                              			  perror("erreur allocation");
                              			  exit(1);
                              			}
                              		    }
                              		  
                              		  char ip[4];
                              		  sscanf(p, "%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3);
                              		  
                              		  trace.tabIP[trace.nbIP].ip[0] = ip[0];
                              		  trace.tabIP[trace.nbIP].ip[1] = ip[1];
                              		  trace.tabIP[trace.nbIP].ip[2] = ip[2];
                              		  trace.tabIP[trace.nbIP].ip[3] = ip[3];
                              		  
                              		  trace.nbIP++;  
                              		  
                              		}  
                              	      else
                              		{
                              		  printf ("format error\n");
                              		  break;
                              		}
                              	    }
                              	  else
                              	    {
                              	      printf ("format error\n");
                              	      break;
                              	    }
                              	}
                                    fclose (fp), fp = NULL;
                                  }
                                else
                                  {
                                    perror (F);
                                  }
                                
                                for(j=0; j<trace.sizeIP; j++)
                                  {
                                    printf("%d.%d.%d.%d ",trace.tabIP[j].ip[0],trace.tabIP[j].ip[1],
                              	     trace.tabIP[j].ip[2],trace.tabIP[j].ip[3]);
                                    printf("\n");
                                  }
                                
                                return 0;
                              }
                              
                              0
                              1. Modérateur
                                Ah oui en effet ça m'etonne pas que ça fasse segfault, car tu n'as jamais alloué de zone mémoire pour l'adresse tabIP
                                typedef struct{
                                  t_ip *tabIP;
                                  size_t nbIP;
                                  size_t sizeIP;
                                }t_route;

                                Il faut un moment allouer la zone de tabIP avec un malloc ou un calloc, car sinon le
                                trace.tabIP[trace.nbIP]
                                déclenchera une erreur de segmentation.

                                Pour faire le travail proprement, pense à libérer cette zone quand elle ne sera plus utilisée avec la fonction free
                                //Allocation de n cases d'élements de type plop
                                plop *p=(plop *)malloc(sizeof(plop)*n);
                                //Libération de cette plage mémoire
                                free(plop);

                                Bonne chance
                                0
                                1. Salut,

                                  j'ai rajouté l'allocation du tableau mais l'erreur de segmentation persiste.

                                  #include <stdio.h>
                                  #include <stdlib.h>
                                  #include <string.h>
                                  #include <assert.h>
                                  
                                  #define F "fichier"
                                  
                                  typedef struct{
                                    unsigned char ip[4];
                                  }t_ip;
                                  
                                  typedef struct{
                                    t_ip *tabIP;
                                    size_t nbIP;
                                    size_t sizeIP;
                                  }t_route;
                                  
                                  static void purge(FILE *fp){
                                    int c;
                                    while((c = fgetc(fp)) != '\n' && c != EOF){}
                                  }
                                  
                                  static void clean(char *s, FILE *fp){
                                    char *p = strchr(s, '\n');
                                    if(p != NULL){
                                      *p = 0;
                                    }
                                    else{
                                      purge(fp);
                                    }
                                  }
                                  
                                  int main(){
                                    FILE *fp = fopen(F, "r");
                                    t_route trace;
                                    trace.nbIP = 0;
                                    trace.sizeIP = 1;
                                    size_t j;
                                  
                                    trace.tabIP = (t_ip *)malloc(sizeof(t_ip) * (trace.sizeIP));
                                    if(trace.tabIP == NULL)
                                      {
                                        perror("erreur allocation\n");
                                        exit(1);
                                      }
                                    
                                    if (fp != NULL)
                                      {
                                        char line[BUFSIZ];
                                        while (fgets(line, sizeof line, fp) != NULL)
                                  	{
                                  	  clean(line, fp);char *p = strtok(line, " ");
                                  	  if (p != NULL)
                                  	    {
                                  	      p = strtok(NULL, " ");
                                  	      if (p != NULL)
                                  		{
                                  		  if(trace.nbIP == trace.sizeIP)
                                  		    {
                                  		      trace.sizeIP *= 2;
                                  		      
                                  		      trace.tabIP = realloc(trace.tabIP, (trace.sizeIP) * sizeof(*trace.tabIP));
                                  		      if (trace.tabIP == NULL)
                                  			{
                                  			  perror("erreur allocation\n");
                                  			  exit(1);
                                  			}
                                  		    }
                                  		  
                                  		  char ip[4];
                                  		  sscanf(p, "%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3);
                                  		  
                                  		  trace.tabIP[trace.nbIP].ip[0] = ip[0];
                                  		  trace.tabIP[trace.nbIP].ip[1] = ip[1];
                                  		  trace.tabIP[trace.nbIP].ip[2] = ip[2];
                                  		  trace.tabIP[trace.nbIP].ip[3] = ip[3];
                                  		  
                                  		  trace.nbIP++;  
                                  		  
                                  		}  
                                  	      else
                                  		{
                                  		  printf ("format error\n");
                                  		  break;
                                  		}
                                  	    }
                                  	  else
                                  	    {
                                  	      printf ("format error\n");
                                  	      break;
                                  	    }
                                  	}
                                        fclose (fp), fp = NULL;
                                      }
                                    else
                                      {
                                        perror (F);
                                      }
                                    
                                    for(j=0; j<trace.nbIP; j++)
                                      {
                                        printf("%d.%d.%d.%d ",trace.tabIP[j].ip[0],trace.tabIP[j].ip[1],
                                  	     trace.tabIP[j].ip[2],trace.tabIP[j].ip[3]);
                                        printf("\n");
                                      }
                                    
                                     free(trace.tabIP);
                                    
                                    return 0;
                                  }
                                  
                                  0
                                  1. Modérateur
                                    La ligne que tu a écrite avec le malloc n'alloue qu'une seule case de taille pouvant accueillir une adresse ip.

                                    Si j'ai bien compris ce que tu fais ce tableau devrait reserver "trace.nbIP" cases. De plus le fais d'incrémenter cette valeur ne corrige pas la plage allouée, qui ne pourra accueillir toujours qu'une seule ip. Le mieux serait d'utiliser une liste qui stockerait chacune des ip, car on ne connaît pas la longueur du chemin a priori.

                                    Pour l'implémentation de la liste ut peux jeter un oeil ici :
                                    https://forums.commentcamarche.net/forum/affich-2242401-c-arbre-n-aire
                                    Je n'ai pas testé le prgramme mais ca te donne une idée de comment faire...

                                    Bonne chance
                                    0