يبدو أن FGETS () تتفوق على المدخلات إلى متغيرات أخرى

StackOverflow https://stackoverflow.com/questions/4112538

  •  29-09-2019
  •  | 
  •  

سؤال

أقوم بقراءة من ملف ، ولكن يبدو أن الإدخال "يفيض" في متغيرات أخرى.

لدي هذين المتغيرين:

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" اسم "Token" ، اعتقدت أنه قد يكون له علاقة بأسماء متطابقة أو شيء ما ، لذا قمت بتغييره إلى 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 ، يتم استخدامه لتخزين المرسلين والمستقبلات والموضوعات والأجسام المسلحة: طقطق التسمية واضح تمامًا>.^

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

لذلك أحاول تخزين MSG في M.TXT للمستلم "C" ، لكنه يتدفق ، وبالكثير من الصدفة ، فإنه يعيد MSG لـ "B" ...

هل كانت مفيدة؟

المحلول

يبدو getmsg يشير إلى الشخصية الثالثة لك str متعادل:

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

لذلك ، في كل مرة تتغير فيها str بالاتصال fgets(), ، تشير السلسلة إلى getmsg يتغير أيضًا لأنه يستخدم نفس الذاكرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top