2010-11-06 4 views
0

Je fais une lecture à partir d'un fichier, mais l'entrée semble "déborder" dans d'autres variables.fgets() semble déborder de l'entrée vers d'autres variables

J'ai ces 2 variables:

char str[250]; //used to store input from stream 
char *getmsg; //already points to some other string 

Le problème est, quand je l'utilise fgets() pour lire l'entrée

printf("1TOKEN:%s\n",getmsg); 
    fp=fopen("m.txt","r"); 
    fp1=fopen("m1.txt","w"); 
     if(fp!=NULL && fp1!=NULL) 
printf("2TOKEN:%s\n",getmsg); 
     while(fgets(str,250,fp)!=NULL){ 
printf("3TOKEN:%s\n",getmsg); 
     printf("read:%s",str); 
printf("4TOKEN:%s\n",getmsg); 

je reçois quelque chose comme ceci:

1TOKEN:c 
2TOKEN:c 
3TOKEN:b atob atobbody 

read:a b atob atobbody 
4TOKEN:b atob atobbody 

Vous voir comment str sorte de flux dans getmsg. Qu'est-ce qui est arrivé là? Comment puis-je éviter cela?

Merci à l'avance :)


dans le code, « getmsg » est appelé « jeton », je pensais que cela pourrait avoir quelque chose à voir avec des noms identiques ou quelque chose de si je l'ai changé à getmsg, même erreur, donc je l'ai changé en arrière ...

     if(buf[0]=='C'){ 
          int login_error=1; 

          fp=fopen("r.txt","r"); 
          if(fp!=NULL){ 
           memcpy(&count,&buf[1],2); 
           pack.boxid=ntohs(count); 

           memcpy(pack.pword,&buf[3],10); 
           printf("boxid:%u pword:%s\n",pack.boxid,pack.pword); 

           while(fgets(str,250,fp)!=NULL){ 

/*"getmsg"===>*/     token=strtok(str," "); 
            token=strtok(NULL," ");//receiver uname 
            token1=strtok(NULL," ");//pword 
            token2=strtok(NULL," ");//boxid 
            sscanf(token2,"%hu",&count);//convert char[] to unsigned short 

            if(pack.boxid==count && strcmp(token1,pack.pword)==0){//uname & pword found 
             login_error=0; 
             printf("found:token:%s\n",token); 
             break; 
            } 
           } 
           if(login_error==1){ 
            count=65535; 
            pack.boxid=htons(count); 
           } 
           if(login_error==0){ 
            count=0; 
            pack.boxid=htons(count); 
           } 
           fclose(fp); 
          } 
printf("1TOKEN:%s\n",token); 
          if(login_error==0){ 
           int msg_error=1; 

           fp=fopen("m.txt","r"); 
           fp1=fopen("m1.txt","w"); 
           if(fp!=NULL && fp1!=NULL){ 
printf("2TOKEN:%s\n",token); 
            while(fgets(str,250,fp)!=NULL){ 


printf("3TOKEN:%s\n",token); 
               printf("read:%s",str); 
             token1=strtok(str," ");//sender 
             token2=strtok(NULL," ");//receiver 
             token3=strtok(NULL," ");//subject 
             token4=strtok(NULL," ");//body 
             printf("m.txt:token1:%s token2:%s token3:%s token4:%s\n",token1,token2,token3,token4); 

             if(msg_error==1 && strcmp(token,token2)==0){//message found 
              msg_error=0; 
              count=0; 
              pack.boxid=htons(count); 
              strcpy(pack.uname,token1); 
              strcpy(pack.subject,token3); 
              strcpy(pack.body,token4); 
              printf("pack:uname:%s subject:%s body:%s token:%s token2:%s strcmp:%d\n",pack.uname,pack.subject,pack.body,token,token2,strcmp(token,token2)); 
              continue; 
             } 

             fprintf(fp1,"%s %s %s %s\n",token1,token2,token3,token4); 
            } 
            if(msg_error==1){ 
             count=65534; 
             pack.boxid=htons(count); 
            } 
            printf("count:%u -> boxid:%u\n",count,pack.boxid); 

            fclose(fp); 
            fclose(fp1); 
           } 

           str[0]='c'; 
           memcpy(&str[1],&pack.boxid,2); 
           memcpy(&str[3],pack.uname,8); 
           memcpy(&str[11],pack.subject,20); 
           memcpy(&str[31],pack.body,200); 
           str[231]='\0'; 

           bytes=232; 
          } 
         } 

ci-dessous est m.txt, il est utilisé pour stocker les expéditeurs, les récepteurs, les sujets et msgbodies. le crépitement de nommage est tout à fait évident>^

a b atob atobbody 
a c atoc atoccc 
b c btoc btoccccc 
b a btoa btoaaaaa 

Je suis en train d'obtenir un msg stocké dans m.txt pour le destinataire « c », mais elle parcourt, et par hasard bien, elle renvoie le msg pour « b » ...

+0

Pouvez-vous poster comment vous init getmsg? – Nyan

+0

veuillez poster getmsg init et m.txt – Ass3mbler

+0

Je pense que c'est token = strtok (str, ""); Si la mémoire me sert bien, je me souviens que strtok remplit votre délimiteur avec '\ 0' dans votre str et le renvoie au jeton. Mais je ne suis pas trop sûr ... –

Répondre

0

on dirait que getmsg pointe vers le troisième caractère de votre tampon str:

`str` is "a b atob atobbody" 
      ^
      | 
      \__ `getmsg` is pointing there. 

par conséquent, chaque fois que vous changez str en appelant fgets(), la chaîne pointée par getmsg change également, car il utilise la même mémoire .

+0

Merci pour votre avis! Ohhh ... Je pense que je le vois maintenant ... strtok() semble contenir le problème ... –

Questions connexes