2010-01-22 4 views
1

strcmp, strtok의 결과를 먹이면 다음 코드에서 뻔뻔스럽게 거짓말하는 것 같습니다. parseList 파라미터의 파일이 입력에Help! 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; 
} 

:

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 

라이즈 ':

job 23 
job 10 

이 출력을 제공!

답변

6

strcmp은 비교할 문자열이 같으면 0을 반환합니다. if (!strcmp(...))을 사용해야합니다.

+0

Raaaage! 고마워, 지금 명백하게 보인다. – mjames

+1

명시 적으로 0과 비교하는 것을 선호합니다. 결과를 부울 값으로 해석 할 기회가 줄어 듭니다. 나는'액세스'와 똑같은 일을한다. –

+0

나는 의미 론적 아이디어를 이름에 넣었으므로'#define streq (s1, s2) (strcmp ((s1), (s2)) == 0)'을 좋아한다. –

1

하지만 포인트의 몇 다음 fread()

  • , 당신은 그렇지 않으면 문자열이 아니다, buffer[fSize] = 0; 설정해야합니다.
  • fseek(file,0,SEEK_END);isn't guaranteed to work을 사용하여 텍스트 파일 또는 이진 파일에서 읽을 문자 수를 결정합니다. 내가 #include <stdlib.h>에 깜빡하고 쉽게 읽을 수 있다면 그 날을 경고 때문에

    buffer = malloc(fSize+1); 
    

    :

개인적으로 malloc() 전화를 작성합니다. 캐스트는 C에 필요하지 않습니다.