مساعدة! STRCMP يكذب علي عندما تتغذى على نتائج Strtok

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

  •  22-09-2019
  •  | 
  •  

سؤال

STRCMP ، عندما يتغذى على نتائج Strtok ، في الكود التالي يبدو أنه يكذب عليّ بشكل صارخ.

int fSize;
char * buffer=NULL;
char * jobToken = "job";
char * nextToken=NULL;
job * curJob=NULL;
struct node * head=NULL;
struct node * parseList(FILE* file){
    fseek(file,0,SEEK_END);
    fSize=ftell(file);
    buffer = (char*)malloc(fSize+1);
    printf("%d chars: reading buffer now:\n",fSize);
    fseek(file,0,SEEK_SET);
    fread (buffer,1,fSize,file);
    nextToken = strtok(buffer, " \n");
    while (nextToken!=NULL){
            printf("**Running  Token: %s**\n",nextToken);
            if (strcmp(nextToken,jobToken)){
                    printf("Accepted %s  as %s\n",nextToken,jobToken);                
            }else{
                    printf("not %s, %s\n",jobToken,nextToken);
            }

            printf("End of state - %s\n",nextToken);

            nextToken = strtok(NULL, " \n");
    }
    free (buffer);
    return NULL;
}

مع هذا الإدخال في ملف في المعلمات الضعيفة:

job 23
job 10

يعطي هذا المخرج:

14 chars: reading buffer now:
**Running  Token: job**
not job, job
End of state - job
**Running  Token: 23**
Accepted 23  as job
End of state - 23
**Running  Token: job**
not job, job
End of state - job
**Running  Token: 10**
Accepted 10  as job
End of state - 10

يكذب!

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

المحلول

strcmp إرجاع 0 عندما تكون الأوتار التي تقارنها متساوية. تحتاج إلى استخدام if (!strcmp(...)).

نصائح أخرى

يعود STRCMP 0 عندما تكون الأوتار متساوية. يرى: http://www.elook.org/programming/c/strcmp.html

لا يتعلق بسؤالك ، ولكن بضع نقاط:

  • بعد fread(), ، يجب عليك تعيين buffer[fSize] = 0;, ، وإلا فإنها ليست سلسلة.
  • تحديد أرقام الأحرف التي يجب قراءتها في ملف نصي أو ملف ثنائي باستخدام fseek(file,0,SEEK_END); ليس مضمونًا للعمل.

شخصيا ، سأكتب malloc() استدعاء على النحو التالي:

buffer = malloc(fSize+1);

لأن ذلك سيحذرني إذا نسيت ذلك #include <stdlib.h>, ، وأسهل للقراءة. الممثلون غير مطلوبون في C.

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