2010-11-06 85 views
0

我正在做一个文件读取,但输入似乎“溢出”到其他变量。fgets()似乎溢出输入到其他变量

我有这2个变量:

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

的问题是,当我使用fgets()读取输入

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); 

我得到的是这样的:

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

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

你请参见str种如何流入getmsg。那里发生了什么?我怎样才能避免这种情况发生?提前:)


代码

谢谢,“的getMsg”被称为“令牌”,我认为它可能有一些做具有相同名称或东西,所以我改成了GETMSG,同错误,所以我又改了回来......

     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; 
          } 
         } 
下面

是m.txt,它被用来存储发送者,接收者,主题和msgbodies: 命名图案是很明显的>^

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

所以我试图让存储在m.txt收件人“C”一味精,但它流过,并通过多巧合,它返回“B”味精...

+0

你可以发表你如何初始化getmsg? – Nyan 2010-11-06 09:22:24

+0

请发帖getmsg初始化和m.txt – Ass3mbler 2010-11-06 09:25:00

+0

我认为这是令牌= strtok(str,“”); 如果内存为我服务,我记得strtok在你的str中用'\ 0'填充你的分隔符,并把它传递回令牌。但我不太确定... – 2010-11-06 09:54:32

回答

0

它看起来像getmsg指向您的str缓冲区的第三个字符:通过调用fgets()

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

因此,每次你改变str,该字符串由getmsg指向也会改变,因为它使用相同的内存

+0

谢谢你的洞察力!哦,我想我现在看到它了...... strtok()似乎存在这个问题...... – 2010-11-06 09:51:24